如何使用在ite名称中包含冒号的属性

时间:2014-04-02 07:10:32

标签: python attributes

当对象属性的名称中包含冒号时,如何使用该属性?我遇到这种情况的代码是:

instances = nova.servers.list()
for i in instances:
        print i.id, i.OS-EXT-SRV-ATTR:hypervisor_hostname

查看链接Find All Elements Given Namespaced AttributeHow do I escape a colon in Python format() when using kwargs?后 我尝试使用attr作为

instances = nova.servers.list()
for i in instances:
        print i.id, i.(attr={"OS-EXT-SRV-ATTR":"hypervisor_hostname"})

但它会将错误视为无效语法。我应该如何使用属性OS-EXT-SRV-ATTR:hypervisor_hostname

2 个答案:

答案 0 :(得分:2)

不要使用具有此类名称的属性的对象。使用词典。

可以使用无效的Python名称设置和获取属性:

Python 2.7.5+ (default, Sep 19 2013, 13:48:49) 

>>> class A():
...     pass
... 

>>> a = A()

>>> setattr(a, 'OS-EXT-SRV-ATTR:hypervisor_hostname', 'some_string')

>>> a.OS-EXT-SRV-ATTR:hypervisor_hostname
  File "<ipython-input-5-849986a021bc>", line 1
    a.OS-EXT-SRV-ATTR:hypervisor_hostname
                     ^
SyntaxError: invalid syntax


>>> getattr(a, 'OS-EXT-SRV-ATTR:hypervisor_hostname')
>>> 'some_string'

>>> 

但是不要这样做,使用dict来存储这些信息,而不是对象的属性。

答案 1 :(得分:0)

使用setattr(object, name, value),然后使用getattr(object, name[, default])

进行阅读

另请参见 How do you programmatically set an attribute?

您为什么要这样做?我发现自己处在需要将AWS Cognito用户字段包装在自己的类而不是字典中的情况下。

        for attr in admin_get_user_dict['UserAttributes']:
            setattr(cognito_user, attr['Name'], attr['Value'])

在Cognito中,自定义属性以 custom: [your_attr_name]为前缀。是的,如果您要设计自己的类,则不惜一切代价避免这种情况。