Chciałbym zdefiniować funkcję dziennika, która jest wywoływana z komunikatem, po którym następuje jedna lub więcej zmiennych do wydrukowania. Tak, coś jak poniżej:Jak wydrukować zmienne argumenty o nazwach z poprzedniego stosu?
log("Oh no, error.", x, d)
dziennika będzie zdefiniowany coś w stylu:
def log(msg, *arg):
# Loop through arg, printing caller's variable's name and value.
Byłoby to log do pliku następujące:
Oh no, error.
x = 5
d = { foo: "Foo", goo: "Goo" }
Można to zrobić w ogóle ? Mogę wydrukować locals i argumenty używając inspect, ale nie wiem, czy mogę iterować przez wartości w bieżącej ramce, używając nazw zmiennych poprzedniej ramki. (locals
w inspect.getargvalues(previousFrame)
ma nazwy, ale wiele innych nazw zbyt.)
W jaki sposób jednoznacznie określasz nazwy zmiennych? Co jeśli osoba dzwoniąca ma "y" w przestrzeni nazw, a jej wartością jest także '5'? Co jeśli dzwoniący przekazuje coś w rodzaju 'd ['foo']'? Czy musisz arbitralnie recurse głęboko w obiektach w obszarze nazw rozmówcy? Co jeśli przekażą wynik wywołania funkcji? 'log ('message', x.bar())'? Istnieje wiele przypadków, które są dość trudne do rozwiązania tutaj, chociaż prawdopodobnie możesz sprawdzić stos i wydrukować _wszystkie zmienne lokalne dzwoniącego. – mgilson
* westchnienie * Tak, myślę, że masz rację mgilson. Więc co powinienem zrobić? Czy muszę usunąć ten wpis? A może to moje myślenie życzeniowe, po prostu chcę funkcji logującej logi zmiennych, które ja daję. Tego w ogóle nie można zrobić? Tak więc, jeśli przekażą 5, wypisuje 5 = 5, jeśli przekażą y, drukuje y = 5. Jeśli przekażą obiekt, wypisuje obiekt = str (obiekt). – Bitdiot
@Bitdiot, dlaczego? Nie jest źle napisane lub źle zorganizowane. I dla mnie osobiście pytanie jest interesujące – ForceBru