У меня есть словарь, в котором мне нужно передать ключи / значения в качестве аргументов ключевого слова .. Например ..
d_args = {'kw1': 'value1', 'kw2': 'value2'}
example(**d_args)
Это работает нормально, но если в d_args dict есть значения, которые не принимаются example
функцией, очевидно, что она умирает .. Скажем, если функция-пример определена какdef example(kw2):
Это проблема, поскольку я не контролирую ни генерацию d_args
, ни example
функцию .. Они оба исходят из внешних модулей и example
принимают только некоторые ключевые аргументы из dict ..
В идеале я бы просто сделал
parsed_kwargs = feedparser.parse(the_url)
valid_kwargs = get_valid_kwargs(parsed_kwargs, valid_for = PyRSS2Gen.RSS2)
PyRSS2Gen.RSS2(**valid_kwargs)
Я, вероятно, просто отфильтрую dict из списка допустимых аргументов ключевых слов, но мне было интересно: есть ли способ программно перечислить аргументы ключевых слов, которые принимает конкретная функция?
inspect.getargspec(f)
устарело, начиная с Python 3.0; современный метод естьinspect.signature(f)
.co_varnames
вариант, с другой стороны, работает в обоих случаях.Это напечатает имена всех допустимых аргументов, ключевых и не ключевых:
Это потому, что сначала
co_varnames
всегда параметры (затем идут локальные переменные, какy
в примере выше).Итак, теперь у вас может быть функция:
Который затем можно было бы использовать так:
EDIT : небольшое дополнение: если вам действительно нужны только ключевые аргументы функции, вы можете использовать
func_defaults
атрибут для их извлечения:Теперь вы можете вызывать свою функцию с известными аргументами, но извлекать kwargs, например:
Это предполагает, что в его подписи
func
не используется магия*args
или нет**kwargs
.источник
В Python 3.0:
источник
Для решения Python 3 вы можете использовать
inspect.signature
и фильтровать в соответствии с типом параметров, о которых вы хотите знать.Возьмем пример функции с параметрами positional или keyword, keyword-only, var positional и var keyword:
Вы можете создать для него объект подписи:
а затем отфильтруйте с пониманием списка, чтобы узнать нужные детали:
и, аналогично, для позиционных переменных используется
p.VAR_POSITIONAL
ключевое слово var withVAR_KEYWORD
.Кроме того, вы можете добавить предложение в if, чтобы проверить, существует ли значение по умолчанию, проверив,
p.default
равно лиp.empty
.источник
Расширение ответа DzinX:
источник