在下面的代码中,我正在定义一个类型,然后使用属性作为字典的键:
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服务访问它,并且只能传递字符串值。
由于
答案 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'