在python和__repr__中动态创建类

rh0*_*ium 6 python

这是一个相当简单的问题,希望你们都可以启发我.在下面的示例中,如何将__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)

unu*_*tbu 3

我猜你想要

print results
Run Code Online (Sandbox Code Playgroud)

回来

["Sparcy", "Libs", "Darwin", "Aaple"]
Run Code Online (Sandbox Code Playgroud)
  1. 打印列表显示其元素的代表。
  2. repr(elt)是由 确定的type(elt).__repr__
  3. 由于在本例中元素是类,因此您需要设置类 __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函数,而不是弄乱元类。