按名称访问自定义python类型属性

时间:2015-02-21 23:27:02

标签: python

在下面的代码中,我正在定义一个类型,然后使用属性作为字典的键:

ProdType= namedtuple('ProdType', 'Cmdty Eqty Fixed')

prod_map = {ProdType.Cmdty: 'Commodities',
            ProdType.Eqty: 'Equities',
            ProdType.Fixed: 'Fixed Income'}

我知道我可以像这样访问字典prod_map代码中的值:

descr = prod_map[ProdType.Cmdty], 

但我的问题是,是否可以通过字符串值访问此地图?如:

  descr = prod_map['Cmdty']

我问,因为一些客户端(例如.net客户端)将通过Web服务访问它,并且只能传递字符串值。

由于

1 个答案:

答案 0 :(得分:1)

看起来您正在尝试将namedtuple用作枚举类型。这不是namedtuples的工作方式。使用verbose=True再次生成namedtuple以查看它创建的内容:

>>> ProdType= namedtuple('ProdType', 'Cmdty Eqty Fixed', verbose=True)
class ProdType(tuple):
    ...
    def __new__(_cls, Cmdty, Eqty, Fixed):
        'Create new instance of ProdType(Cmdty, Eqty, Fixed)'
        return _tuple.__new__(_cls, (Cmdty, Eqty, Fixed))
    ...
    Cmdty = _property(_itemgetter(0), doc='Alias for field number 0')
    Eqty = _property(_itemgetter(1), doc='Alias for field number 1')
    Fixed = _property(_itemgetter(2), doc='Alias for field number 2')

上面显示我们刚刚为每个实例中我们期望的3个属性创建了一个带有属性别名的元组类。所以,你根本不需要字典,你可以像这样使用ProdType的实例:

>>> pt = ProdType('Commodities', 'Equity', 'Fixed Income')
>>> pt.Cmdty
'Commodities'
>>> pt.Eqty
'Equity'

您应该使用namedtuple属性(如上所述)访问namedtuple的属性,但如果确实需要通过字符串访问namedtuple,您可以使用__getattribute__,如下所示:< / p>

>>> pt.__getattribute__('Fixed')
'Fixed Income'