Tôi đoán rằng bạn muốn
print results
trở
["Sparcy", "Libs", "Darwin", "Aaple"]
- In danh sách hiển thị thông tin về các phần tử của nó.
repr(elt)
được xác định bởi type(elt).__repr__
.
- Vì trong trường hợp này các yếu tố là các lớp, bạn cần phải đặt
__repr__
cho loại lớp học.
import re
inputlist = '''\
Project="Sparcy" Desc=""
Project="Libs" Desc=""
Project="Darwin" Desc=""
Project="Aaple" Desc="The big project"
Site="Phoenix" Protocol="Cheese"'''
regex = re.compile('([^ =]+) *= *("[^"]*"|[^ ]*)')
results = []
for project in inputlist.split("\n"):
items = [ (k.strip(), v.strip()) for k, v in regex.findall(project)]
if len(items) < 2:
print("Houston we have a problem - Only %s k/v pair found for %s" % (len(items), project))
continue
item_dict = dict(items[1:])
item_dict['name'] = items[0][1]
projectname=items[0][0]
metametaklass=type('meta_'+projectname,(type,),{'__repr__':lambda cls: cls.__name__})
metaklass=metametaklass(projectname,(type,),{'__repr__':lambda cls: cls.name})
klass=metaklass(projectname+'_class', (object,), item_dict)
results.append(klass)
print(results)
mang
["Sparcy", "Libs", "Darwin", "Aaple", "Phoenix"]
và
for result in results:
print(type(result))
print(result)
print('-'*80)
sản lượng
Project
"Sparcy"
--------------------------------------------------------------------------------
Project
"Libs"
--------------------------------------------------------------------------------
Project
"Darwin"
--------------------------------------------------------------------------------
Project
"Aaple"
--------------------------------------------------------------------------------
Site
"Phoenix"
--------------------------------------------------------------------------------
PS. Lưu ý rằng đây là sự đảo lộn của __repr__
, vì repr
của một đối tượng được cho là một biểu diễn chuỗi rõ ràng của đối tượng. Nghĩa là, nó được cho là cung cấp đủ thông tin để tái tạo đối tượng. Có thể bạn nên định nghĩa một hàm print
khác thay vì làm rối tung bằng metaclasses.
Bạn có biết cách xác định loại không. Cách tôi hiểu công trình này là nếu '__metaclass__' được định nghĩa thì nó sẽ sử dụng nó. Bạn đang tận dụng điều đó cho '__repr__'. Làm thế nào để tôi không tuyên truyền cho '__metaclass__'. Các __goal → loại (Sparky) == Project__ – rh0dium
@ rh0dium: Tôi không chắc tôi hiểu câu hỏi. Tôi đã chỉnh sửa bài đăng của mình để 'print (type (klass))' sẽ in 'Project'. – unutbu
Nhưng sau đó nó không còn năng động nữa. Điều gì sẽ xảy ra khi bạn gieo nó .. 'inputlist = 'Site =" Phoenix "Protocol =" Cheese "\ n' – rh0dium