Jak mogę znaleźć liczbę argumentów funkcji Pythona?

Jak mogę znaleźć liczbę argumentów funkcji Pythona? Muszę wiedzieć, ile ma normalnych argumentów i ile nazwanych argumentów.

Przykład:

def someMethod(self, arg1, kwarg1=None):
    pass

Ta metoda ma 2 argumenty i 1 nazwany argument.

Author: Aaron Digulla, 2009-05-11

7 answers

Wcześniej zaakceptowana odpowiedź została deprecated OD Python 3.0. Zamiast używać inspect.getargspec powinieneś teraz wybrać klasę Signature, która ją zastąpiła.

Tworzenie podpisu dla funkcji jest łatwe poprzez signature funkcja:

from inspect import signature

def someMethod(self, arg1, kwarg1=None):
    pass

sig = signature(someMethod)

Teraz możesz albo szybko wyświetlić jego parametry przez str ing to:

str(sig)  # returns: '(self, arg1, kwarg1=None)'

Lub możesz również uzyskać mapowanie nazw atrybutów do obiektów parametrycznych za pomocą sig.parameters.

params = sig.parameters 
print(params['kwarg1']) # prints: kwarg1=20

Dodatkowo, możesz wywołać len na sig.parameters, aby zobaczyć liczbę argumentów, których wymaga Ta funkcja:

print(len(params))  # 3

Każdy wpis w mapowaniu params jest w rzeczywistości Parameter obiekt , który ma dodatkowe atrybuty ułatwiające życie. Na przykład pobranie parametru i wyświetlenie jego wartości domyślnej jest teraz łatwo wykonywane za pomocą:

kwarg1 = params['kwarg1']
kwarg1.default # returns: None

Podobnie dla reszty obiektów zawartych w parameters.


Co do Użytkowników Pythona 2.x, podczas gdy inspect.getargspec isn't deprecated, język wkrótce będzie : -). Klasa Signature nie jest dostępna w serii 2.x i nie będzie. Więc nadal musisz pracować z inspect.getargspec.

Jeśli chodzi o przejście pomiędzy Pythonem 2 i 3, Jeśli masz kod, który opiera się na interfejsie getargspec w Pythonie 2 i przejście na signature w 3 jest zbyt trudne, masz cenną opcję użycia inspect.getfullargspec. Oferuje podobny interfejs do getargspec (pojedynczy argument wywoływalny) w celu przechwycenia argumentów z funkcji, jednocześnie obsługując niektóre dodatkowe przypadki, które getargspec nie:

from inspect import getfullargspec

def someMethod(self, arg1, kwarg1=None):
    pass

args = getfullargspec(someMethod)

Jak z getargspec, getfullargspec zwraca NamedTuple, która zawiera argumenty.

print(args)
FullArgSpec(args=['self', 'arg1', 'kwarg1'], varargs=None, varkw=None, defaults=(None,), kwonlyargs=[], kwonlydefaults=None, annotations={})
 60
Author: Jim Fasarakis Hilliard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 18:55:56
import inspect
inspect.getargspec(someMethod)

Zobacz moduł inspect

 116
Author: Jochen Ritzel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-11 12:49:16
someMethod.func_code.co_argcount

Lub, jeśli bieżąca nazwa funkcji jest nieokreślona:

import sys

sys._getframe().func_code.co_argcount
 26
Author: miaoever,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-23 02:58:21

Sprawdź.getargspec()

Pobiera nazwy i wartości domyślne argumentów funkcji. Zwracana jest krotka czterech rzeczy: (args, varargs, varkw, defaults). args jest listą nazw argumentów (może zawierać listy zagnieżdżone). varargs i varkw są nazwami argumentów * i * * lub None. defaults jest krotką wartości domyślnych argumentów lub None, jeśli nie ma argumentów domyślnych; jeśli ta krotka ma n elementów, odpowiadają one ostatnim N elementom wymienionym w args.

Changed in version 2.6: zwraca nazwaną krotkę ArgSpec (args, varargs, keywords, defaults).

Zobacz can-you-list-the-keyword-arguments-a-python-function-receives .

 16
Author: gimel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:26

Dodając do powyższego, widziałem również, że większość razy funkcja help() naprawdę pomaga

Na przykład, podaje wszystkie szczegóły dotyczące argumentów, które bierze.

help(<method>)

Daje poniżej

method(self, **kwargs) method of apiclient.discovery.Resource instance
Retrieves a report which is a collection of properties / statistics for a specific customer.

Args:
  date: string, Represents the date in yyyy-mm-dd format for which the data is to be fetched. (required)
  pageToken: string, Token to specify next page.
  parameters: string, Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2.

Returns:
  An object of the form:

    { # JSON template for a collection of usage reports.
    "nextPageToken": "A String", # Token for retrieving the next page
    "kind": "admin#reports#usageReports", # Th
 3
Author: Venu Murthy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-31 12:29:32

Jak sugerują inne odpowiedzi, getargspec działa dobrze, o ile pytana rzecz jest rzeczywiście funkcją. Nie działa dla wbudowanych funkcji takich jak open, len, itd, i rzuci wyjątek w takich przypadkach:

TypeError: <built-in function open> is not a Python function

Poniższa funkcja (zainspirowana ta odpowiedź) pokazuje obejście. Zwraca liczbę args oczekiwaną przez f:

from inspect import isfunction, getargspec
def num_args(f):
  if isfunction(f):
    return len(getargspec(f).args)
  else:
    spec = f.__doc__.split('\n')[0]
    args = spec[spec.find('(')+1:spec.find(')')]
    return args.count(',')+1 if args else 0

Chodzi o to, aby przeanalizować spec funkcji z __doc__ string. Oczywiście zależy to od format wspomnianego ciągu więc trudno wytrzymać!

 1
Author: starfry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:05

Inspect.getargspec () to meet your needs

from inspect import getargspec

def func(a, b):
    pass
print len(getargspec(func).args)
 0
Author: Eds_k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-30 08:48:35