Mam dyktando, które muszę przekazać klucz / wartości jako argumenty słów kluczowych .. Na przykład ..
d_args = {'kw1': 'value1', 'kw2': 'value2'}
example(**d_args)
Działa to dobrze, ale jeśli w dictwie d_args znajdują się wartości, które nie są akceptowane przez example
funkcję, to oczywiście umiera. Powiedzmy, jeśli przykładowa funkcja jest zdefiniowana jakodef example(kw2):
Jest to problem, ponieważ nie kontroluję ani generowania funkcji d_args
, ani example
funkcji. Oba pochodzą z modułów zewnętrznych i example
akceptują tylko niektóre argumenty słów kluczowych z dyktowania.
Idealnie bym to zrobił
parsed_kwargs = feedparser.parse(the_url)
valid_kwargs = get_valid_kwargs(parsed_kwargs, valid_for = PyRSS2Gen.RSS2)
PyRSS2Gen.RSS2(**valid_kwargs)
Prawdopodobnie po prostu przefiltruję dict, z listy prawidłowych argumentów-słów kluczowych, ale zastanawiałem się: czy istnieje sposób na programowe wyświetlenie argumentów słów kluczowych, które przyjmuje określona funkcja?
inspect.getargspec(f)
jest przestarzałe od Pythona 3.0; nowoczesna metoda toinspect.signature(f)
.co_varnames
drugiej strony opcja działa w obu przypadkach.Spowoduje to wyświetlenie nazw wszystkich dopuszczalnych argumentów, słów kluczowych i innych niż słowa kluczowe:
Dzieje się tak, ponieważ najpierw
co_varnames
są zawsze parametry (następne są zmienne lokalne, jaky
w powyższym przykładzie).Więc teraz możesz mieć funkcję:
Którego następnie możesz użyć w ten sposób:
EDYCJA : Mały dodatek: jeśli naprawdę potrzebujesz tylko argumentów słów kluczowych funkcji, możesz użyć
func_defaults
atrybutu, aby je wyodrębnić:Możesz teraz wywołać swoją funkcję ze znanymi argumentami, ale wyodrębnionymi kwargami, np:
Zakłada się, że
func
nie używa*args
lub**kwargs
magii w jej podpisania.źródło
W Pythonie 3.0:
źródło
W przypadku rozwiązania Python 3 możesz używać
inspect.signature
i filtrować według rodzaju parametrów , o których chcesz wiedzieć.Pobranie przykładowej funkcji z parametrami pozycyjnymi lub słowami kluczowymi, tylko słowami kluczowymi, var pozycyjnymi i var słowo kluczowe:
Możesz stworzyć dla niego obiekt podpisu:
a następnie przefiltruj listę, aby znaleźć potrzebne szczegóły:
i podobnie, dla pozycjonowania var przy użyciu
p.VAR_POSITIONAL
słowa kluczowego i var zVAR_KEYWORD
.Ponadto możesz dodać klauzulę do if, aby sprawdzić, czy istnieje wartość domyślna, sprawdzając, czy
p.default
jest równap.empty
.źródło
Rozszerzenie odpowiedzi DzinX:
źródło