Zdecydowanie polecam przeciwko nadużywaniu settrace. Zakładam, że rozumiesz te rzeczy, ale inni idą później, może nie. Istnieje kilka powodów:
Settrace to narzędzie bardzo tępe. Przykład OP jest prosty, ale praktycznie nie ma możliwości rozszerzenia go na rzeczywisty system.
To tajemnicze. Każdy, kto przyjrzy się twojemu kodowi, będzie kompletnie zaskoczony, dlaczego robi to, co robi.
Jest powolny. Wywoływanie funkcji Pythona dla każdej linii Pythona spowoduje spowolnienie programu o wiele wielokrotności.
Jest to zwykle niepotrzebne. Oryginalny przykład tutaj mógłby zostać zrealizowany na kilka innych sposobów (zmodyfikuj funkcję, zawiń funkcję w dekoratorze, wywołaj ją za pomocą innej funkcji itd.), Z których każda byłaby lepsza niż settrace.
Trudno jest dobrze. W oryginalnym przykładzie, gdybyś nie zadzwonił bezpośrednio do f, ale zamiast tego nazywał się g, który nazwał f, twoja funkcja śledzenia nie wykonałaby swojej pracy, ponieważ zwróciłeś None z funkcji trace, więc jest ona wywoływana tylko raz, a następnie zapomniana.
Utrzyma inne narzędzia do pracy. Ten program nie będzie debuggować (ponieważ debuggery używają settrace), nie będzie można go prześledzić, nie będzie można zmierzyć jego zasięgu kodu, itp. Częściowo wynika to z braku przewidywania ze strony implementatorów Python: oni dał nam settrace, ale bez gettrace, więc trudno jest mieć dwie funkcje śledzenia, które działają razem.
Funkcje śledzenia umożliwiają tworzenie fajnych hacków. Fajnie jest móc go nadużywać, ale nie używaj go do prawdziwych rzeczy. Jeśli zabrzmię hectoring, przepraszam, ale zostało to zrobione w prawdziwym kodzie i to jest ból. Na przykład, DecoratorTools wykorzystuje funkcję śledzenia wykonać magiczną wyczyn dokonywania tej pracy składni w Pythonie 2.3:
# Method decorator example
from peak.util.decorators import decorate
class Demo1(object):
decorate(classmethod) # equivalent to @classmethod
def example(cls):
print "hello from", cls
Zgrabny hack, ale niestety, to znaczy, że każdy kod, który używany DecoratorTools nie będzie działać z zakresu .py (lub, jak sądzę, debuggery). Niezbyt dobry kompromis, jeśli mnie poprosisz. Zmieniłem cover.py, aby zapewnić tryb, który pozwala mu pracować z DecoratorTools, ale szkoda, że nie musiałem.
Nawet kod w standardowej bibliotece czasami źle to robi. Pyexpat postanowił być inny niż każdy inny moduł rozszerzenia i wywoływał funkcję trace tak, jakby był to kod Pythona. Szkoda, że oni did a bad job of it.
</rant>
nie jest to zła – Casebash
Tak, ale w dobry sposób istnieje :) – Geo