Как вызвать элемент словаря, который может быть целым числом или функцией? - PullRequest
2 голосов
/ 21 мая 2019

Я пытаюсь придумать код, который будет выполнять статистический анализ юнита из настольной игры для личного использования. Я использую словари для хранения данных юнитов, и я столкнулся с проблемой, когда урон от атаки может быть либо целым числом, либо результатом броска кубика «d6»

Я сделал функцию, которая принимает значение d6 и оценивает его как d (6), затем выполняет простой расчет, чтобы определить среднее количество снимков, 3.5. По соображениям удобства я хотел бы иметь возможность сохранять «d (6)» в словаре вместо преобразования вручную в 3,5 для каждой единицы, которую я хочу вставить.

В очень урезанном примере словаря единиц,

unit = {'damage':1}

или

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

Я ищу способ проверить вызов «повреждения», если значение является целым числом или строкой, а затем, если это строка, убрать из нее кавычки и оценить ее как функцию. Мне не очень повезло в поиске, так как я не знаю, что я ищу.

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

Сделайте каждое значение вашего словаря непротиворечивым и верните лямбда-функцию, которую вы можете вызвать, функция d не будет оценена, пока ее не вызовут.

>>> unit = {'damage': lambda: 1, 'b': lambda: d(6) }
>>> unit['damage']()
1
>>> unit['b']()
result of d(6)
0 голосов
/ 21 мая 2019

Это близко к вопросу мнения.Вы можете быть согласны с содержанием словаря как , предложенным @ Sayse , или протестировать его во время использования.Но в любом случае вам не следует использовать строку, а вызывать ее для непосредственного вызова без использования нахмурившегося eval:

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

Python упрощает использование параметризованных функций.Например, если вы хотите вернуть значение d(6), вы можете использовать лямбду:

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

или functools.partial:

unit = {'damage': functools.partial(d, 6)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...