下面的代码
def _say(x): return x
class newObject(object):
def __init__(self, **kw):
for x in kw:
self.x = kw[x]
for i in self.x:
a = self.x[i]
eval('self.x.{u}={t}'.format(u=i, t=a)) #on another note, why would setattr(self.x, i, a) not work
self.object_ret()
def object_ret(self):
return self
data = newObject(**{
'ranks':{
'one':['yhggti','aragos','raithinki'],
'two':['grythin','radios'],
'three':['riyoken','schrodinger']},
'nicknames':{
'riyoken':['theos','arahiron'],
'illogic':['harab','thing']},
'commands':{
'say':_say},
})
概述了我希望如何在另一个属性末尾向对象添加更多属性。我以前也这样过
class newObject(object):
def __init__(self, **kw):
[setattr(self, x, kw[x]) for x in kw]
self.object_ret()
data.nicknames 将返回的位置
>>> data.nicknames
{'illogic': ['harab', 'thing'], 'riyoken': ['theos', 'arahiron']}
现在我希望能够调用 data.nicknames.riyoken 并返回 ['theos', 'arahiron']
这不适用于原始设置,因此是代码的顶部部分。 eval('self.x.{u}={t}'.format(u=i, t=a))
然而部分错误并给出了诸如
File "<string>", line 1
self.x.say=<function _say at 0x030E9420>
^
SyntaxError: invalid syntax
如果有任何方法可以让它在我可以调用 data.nicknames.riyoken 或 data.commands.say 的地方工作,我将不胜感激。
最佳答案
你混淆了一些事情。这是一个接近您的代码的工作版本:
class Attributes:
pass
class NewObject(object):
def __init__(self, **kw):
for x in kw:
attrs = Attributes()
setattr(self, x, attrs)
for i in kw[x]:
a = kw[x][i]
setattr(attrs, i, a)
我会这样做:
class NewObject(object):
def __init__(self, **kwargs):
for key, value in kwargs.items():
if isinstance(value, dict):
value = NewObject(**value)
setattr(self, key, value)
这将处理任意嵌套的字典。
关于python - 向 python 添加嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37800161/