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.
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={})
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
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
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
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 .
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
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ć!
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)
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