Ludziom którym się to przydarzyło w moment uchwycą o co chodzi czytając tytuł. Pdb ma duże możliwości, tak wiem, że zmusza ludzi do nadmiernego klepania ale jest bardzo uniwersalny. Nie wiem dlaczego jedna z wewnętrznych komend pdb to „args”, trochę to może skomplikować sprawę jeśli nie zdajesz sobie z tego sprawy. Oto co dostaniesz jeśli wpiszesz „args” w pdb.
def foo(*args, **kwargs):
import pdb; pdb.set_trace()
print args
if __name__ == "__main__":
foo('argument 1', 'argument 2', 'argument 3')
(Pdb) args
args = ('argument 1', 'argument 2', 'argument 3')
kwargs = {}
(Pdb) p args
('argument 1', 'argument 2', 'argument 3')
Ja spodziewałem się czegoś innego a mianowicie tylko i wyłącznie krotki (tuple) z argumentami. Dopiero po pewnym czasie kiedy w trójkę gapiliśmy się na to kumpel zrozumiał gdzie jest problem. Wystarczy w pdb wpisać „h” i zerknąć na listę komend, gdzie znajdzie się args. Pdb najzwyczajniej w świecie wywołuje swoją wewnętrzną komendę zamiast wyświetlić to co znajduje się w args. Dlaczego to zostało tak zrobione? Właściwie powinienem zadać pytanie, dlaczego *args jest tak lansowane? Co prawda takie zachowanie będzie zagadką tylko raz ale komuś może zająć dużo czasu odkrycie, że to nie jest błąd.
Aby tego uniknąć można zamiast *args użyć innej nazwy ale tak już się przyjęło i gdzie nie spojrzę na kod to widzę *args a nie *params. Dobrze też uważać i nie tworzyć sobie w pdb zmiennych, które nazywają się tak jak komendy debuggera. Należy wystrzegać się zwłaszcza „c” lub „q”, ale to też jednorazowe pomyłki.
A tak w ogóle to:
:W0142: *Used * or ** magic*
Used when a function or method is called using `*args` or `**kwargs` to dispatch arguments.
This doesn’t improve readability and should be used with care.