Chciałbym wiedzieć, czy jest możliwe po introspekcja w CPython:Powiedz, jak argument został odebrany przez funkcję?
>>> def potato(x=69):
... if x == 69 and ???:
... print '69 was taken from argument defaults'
... if x == 69 and ???:
... print '69 was passed as positional arg'
... if x == 69 and ???:
... print '69 was passed as kwarg'
...
>>> potato()
69 was taken from argument defaults
>>> potato(69)
69 was passed as positional arg
>>> potato(x=69)
69 was passed as kwarg
Jestem zainteresowany zarówno python2 i python3 odpowiedzi, jeśli są one różne.
Wszelkiego rodzaju Blackmagic udziałem inspect
, traceback
, pdb
, sys._getframe
itp dopuszczalna jest tutaj. Oczywiście modyfikowanie argspec funkcji jest niedozwolone.
You” d musi przeanalizować kod źródłowy ramki wywołującej. Które mogłyby być używane 'potato (* args)' lub 'potato (** kwargs)', w którym to momencie musisz przeanalizować, co to jest * in * 'args' lub' kwargs', itd. To staje się skomplikowane * szybko *. –
Ramka wywołująca może również przechowywać 'potato' pod * inną * nazwą lub na liście. Może być zaangażowany dekorator lub 'exec' lub' eval() '. Lub funkcja została wywołana jako wywołanie zwrotne przez rozszerzenie C. *dreszcz*. Możliwości są tutaj nieograniczone. –
Po prostu naciśnij 'u' w' pdb', aby zwiększyć ramkę w stosie i sprawdzić, jaki kod został tam wykonany. Ty jako człowiek możesz znacznie łatwiej sprawdzić, co się tam wydarzyło i co zostało przekazane "ziemniakom". –