这是一个相当简单的问题,希望你们都可以启发我.在下面的示例中,如何将__repr__定义为动态设置为self.name?
谢谢大家!
import re
inputlist = 'Project="Sparcy" Desc=""\nProject="Libs" Desc=""\nProject="Darwin" Desc=""\nProject="Aaple" Desc="The big project"'
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]
klass = type(items[0][0], (object,), item_dict)
results.append(klass)
print results
Run Code Online (Sandbox Code Playgroud)
我要找的是这个
伪代码
for result in results
type(result) ? Project
print result ? Sparky
Run Code Online (Sandbox Code Playgroud)
我猜你想要
print results
Run Code Online (Sandbox Code Playgroud)
回来
["Sparcy", "Libs", "Darwin", "Aaple"]
Run Code Online (Sandbox Code Playgroud)
repr(elt)是由 确定的type(elt).__repr__。__repr__的类型。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)
Run Code Online (Sandbox Code Playgroud)
产量
["Sparcy", "Libs", "Darwin", "Aaple", "Phoenix"]
Run Code Online (Sandbox Code Playgroud)
和
for result in results:
print(type(result))
print(result)
print('-'*80)
Run Code Online (Sandbox Code Playgroud)
产量
Project
"Sparcy"
--------------------------------------------------------------------------------
Project
"Libs"
--------------------------------------------------------------------------------
Project
"Darwin"
--------------------------------------------------------------------------------
Project
"Aaple"
--------------------------------------------------------------------------------
Site
"Phoenix"
--------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
附言。请注意,这是 的歪曲__repr__,因为repr对象的 应该是该对象的明确字符串表示形式。也就是说,它应该提供足够的信息来再现该对象。您可能应该定义一个不同的print函数,而不是弄乱元类。
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |