Как узнать значения по умолчанию аргумента конкретной функции в другой функции в Python?

Предположим, у нас есть такая функция:

def myFunction(arg1='a default value'):
  pass

Мы можем использовать самоанализ, чтобы узнать имена аргументов, которые myFunction() принимает с помощью myFunction.func_code.co_varnames, но как узнать значение по умолчанию arg1 (которое в приведенном выше примере равно 'a default value')?


person Srikanth    schedule 01.02.2011    source источник
comment
Могу я вместо этого сделать вики? Я не могу узнать, как это сделать. Я узнал ответ вскоре после того, как задал вопрос, поэтому, поскольку я ответил на свой вопрос, лучше сделать его вики.   -  person Srikanth    schedule 01.02.2011
comment
@Джош: Спасибо. Получил гораздо лучший ответ от Дункана и вместо этого отметил его как принятый ответ.   -  person Srikanth    schedule 03.02.2011


Ответы (4)


В качестве альтернативы просмотру атрибутов функции вы можете использовать модуль проверки для более удобного интерфейса:

Для интерпретаторов Python 3.x:

import inspect
spec = inspect.getfullargspec(myFunction)

Затем spec представляет собой объект FullArgSpec с такими атрибутами, как args и defaults:

FullArgSpec(args=['arg1'], varargs=None, varkw=None, defaults=('a default value',), kwonlyargs=[], kwonlydefaults=None, annotations={})

Некоторые из этих атрибутов недоступны в Python 2, поэтому, если вам нужно использовать старую версию, inspect.getargspec(myFunction) даст вам аналогичное значение без функций Python 3 (getargspec также работает в Python 3, но устарел с Python 3.0, поэтому не используйте Это):

import inspect
spec = inspect.getargspec(myFunction)

Затем spec представляет собой объект ArgSpec с такими атрибутами, как args и defaults:

ArgSpec(args=['arg1'], varargs=None, keywords=None, defaults=('a default value',))
person Duncan    schedule 01.02.2011
comment
Это намного лучше, потому что вы также получаете имена переменных, а также их значения по умолчанию (если они есть)! - person Tim Pietzcker; 01.02.2011
comment
Обратите внимание, что это устарело с Python 3.0 в пользу inspect.getfullargspec - person nedned; 17.01.2019

Если вы определяете функцию f следующим образом:

>>> def f(a=1, b=True, c="foo"):
...     pass
...

в Python 2 вы можете использовать:

>>> f.func_defaults
(1, True, 'foo')
>>> help(f)
Help on function f in module __main__:
f(a=1, b=True, c='foo')

тогда как в Python 3 это:

>>> f.__defaults__
(1, True, 'foo')
>>> help(f)
Help on function f in module __main__:
f(a=1, b=True, c='foo')
person Tim Pietzcker    schedule 01.02.2011
comment
Посмотрите ответ Дункана, он намного лучше этого. - person Tim Pietzcker; 01.02.2011

Виноват. Конечно, есть myFunction.func_defaults.

person Srikanth    schedule 01.02.2011

inspect.signature также предоставляет удобный способ повторения параметров функции https://docs.python.org/3/library/inspect.html#inspect.signature

import inspect

def f(*cake, one, two=None, three=3): pass

s = inspect.signature(f)
# <Signature (*cake, one, two=None, three=3)>
s.parameters['three'].default
3
s.parameters['cake'].kind
# <_ParameterKind.VAR_POSITIONAL: 2>
s.parameters['cake'].name
'cake'
person Glycerine    schedule 24.02.2020