如何调用可以为整数或函数的字典项?

时间:2019-05-21 12:07:18

标签: python function dictionary

我正在尝试提出一个代码,该代码将对台式游戏中用于个人使用的单位进行统计分析。我正在使用字典来存储单位数据,并且遇到了一个问题,即攻击造成的损害可能是整数值,也可能是掷骰子“ d6”的结果。

我制作了一个函数,其值为d6并将其评估为d(6),然后运行简单的计算以确定平均可拍摄张数3.5。为了方便起见,我希望能够在字典中保留“ d(6)”,而不是为要放入的每个单元手动转换为3.5。

在单元字典的精简示例中,

unit = {'damage':1}

unit = {'damage':'d(6)'}

我正在寻找一种检查“损坏”调用的方法,以了解该值是整数还是字符串,然后如果它是字符串,请从中去除引号并将其评估为函数。我的搜索没有很多运气,因为我真的不知道自己在搜索什么。

2 个答案:

答案 0 :(得分:3)

使字典中的每个单个值保持一致,并返回一个可以调用的lambda函数,在调用d函数之前,不会对其进行评估。

>>> unit = {'damage': lambda: 1, 'b': lambda: d(6) }
>>> unit['damage']()
1
>>> unit['b']()
result of d(6)

答案 1 :(得分:0)

这几乎是一个观点问题。您可以将字典的内容与suggested by @Sayse保持一致,也可以在使用时对其进行测试。但无论哪种情况,都不应使用字符串,而应使用可调用的字符串来直接调用它,而无需使用皱着眉头的eval

def process (dic, key):
    return dic[key]() if callable(dic[key]) else dic[key]
...
damage = process(unit, 'damage')

Python使使用参数化函数变得容易。例如,如果要返回d(6)的值,则可以使用lambda:

unit = {'damage': (lambda : d(6))}

functools.partial

unit = {'damage': functools.partial(d, 6)}