Вытащить поле словаря для использования в качестве имени функции - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь создать функции, используя цикл for, ссылаясь на словарь.

Мои две разные попытки не увенчались успехом:

dictionary = {1:'Apples', 2:'Pears', 3:'Carrots'}

for i in range(1, 4, 1):
    name = dictionary[i]
    def name(price, quantity):
        total = price*quantity
        return total

print(Apples(3, 2))

Этот метод был неудачным как 'name'становится именем функции, которая определяется.( NameError )

for i in range(1, 4, 1):
    def dictionary[i](price, quantity):
        total = price*quantity
        return total

Этот метод не удался, поскольку квадратные скобки при определении функции считаются синтаксической ошибкой.

Есть ли способ, которым я могу получитьимя поля в словаре, чтобы сделать его функцией?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Поскольку вы, по сути, копируете функцию на несколько имен с разными именами и проверяете это в своем комментарии «используйте разные имена, но все они по своей сути одинаковы», я думаю, что самый простой способ - это сначала определить базовую функцию,и скопируйте его на сколько угодно новых функций.Например:

Ваша базовая функция всегда возвращает price*quantity, поэтому давайте определим это:

def base_fun(price, quantity):
    total = price*quantity
    return total

Теперь давайте клонируем это в элементы вашего словаря:

import copy

for k, v in dictionary.items():
  globals()[v] = copy.copy(base_fun)

print(Apples(3, 2)) #returns 6
print(Pears(5, 4)) #returns 20
print(Pears(0, 3)) #returns 0
0 голосов
/ 20 февраля 2019

Вы можете сделать

for i in range(1, 4, 1):
    name = dictionary[i]
    def _fn(price, quantity):
        total = price*quantity
        return total
    globals()[name] = _fn

, но делать это довольно редко.

Более разумный способ сделать это (как описывает @martineau) - это поместить функциинепосредственно в dict:

def Apples(price, quantity):
    total = price * quantity
    return total

def Pears(...): ...
def Carrots(...): ...

dictionary = {1: Apples, 2: Pears, 3: Carrots}

вы бы назвали такие функции как:

dictionary[1](price=2.50, quantity=4)

, если вы переименуете dictionary в total, это может быть вполне читабельно:

product_id = 1
total_price = total[product_id](price=2.50, quantity=4)

если все функции одинаковы, это еще проще:

def totalfn(price, quantity):
    total = price * quantity
    return total

total = {1: totalfn, 2: totalfn, 3: totalfn}

или даже короче, если у вас много продуктов:

total = {productid: totalfn for productid in (1,2,3)}
...