Предположим, теперь у меня есть четко определенная функция
def f1(a):
...
и я не могу изменить его определение. Теперь я хочу вызвать это аргументом из словаря
D = { 'a':1 , 'b':2}
Если я назову это как
f1(**D)
будет синтаксическая ошибка (потому что b не определено в f1). Мой вопрос в том, могу ли я найти умный способ позволить функции найти только необходимый аргумент?
Что нужно от словаря для вашей функции? Собираетесь ли вы использовать словарь целиком? Отображение того, какие действия вы хотите, чтобы выполняла ваша функция, очень помогло бы
Какой тип параметра ожидает функция? Какой аргумент из словаря вы хотите передать?






Вот пример функции, которая имеет словарь и использует только клавишу «b»:
In [14]: def f1(mydict):
...: return mydict['b']
...:
In [15]: x = {'a': 1, 'b':2}
In [16]: f1(x)
Out[16]: 2
Я не голосовал против, но вы не должны использовать dict в качестве имени переменной, потому что он затеняет встроенный
Вы можете использовать inspect.getargspec:
d = {'a': 5, 'b': 6, 'c': 7}
def f(a,b):
return a + b
f(*[d[arg] for arg in inspect.getargspec(f).args])
что дает 11.
Спасибо, Юджин, getargspec унаследован, вместо этого вы должны использовать getfullargspec, который в данном случае используется точно так же.
Deprecated since version 3.0: Use getfullargspec() for an updated API that is usually a drop-in replacement, but also correctly handles function annotations and keyword-only parameters.@EugeneYarmash THanls
Вы можете получить имена аргументов из объект кода функции, а затем найти их значения в словаре:
>>> def f(a):
... b = 2
... return a + b
...
>>> D = {'a': 1, 'b': 2, 'c': 3}
>>> nargs = f.__code__.co_argcount
>>> varnames = f.__code__.co_varnames
>>> f(*(D[arg] for arg in varnames[:nargs]))
3
Добро пожаловать в StackOverflow. Пожалуйста, прочтите и следуйте инструкциям по публикации в справочной документации, как было предложено при создании этой учетной записи. Здесь применяются По теме, как спросить и ... идеальный вопрос.