Ich habe viele Funktionen wie:

def DBworker_thatdoes_job7():
    print "DBworker_thatdoes_job7 starting..."

    ... the actual code here ...

    print "DBworker_thatdoes_job7 finished."

Wie geht das, ohne die Funktionsnamen fest zu codieren? Folgendes möchte ich erreichen:

def DBworker_thatdoes_job7():
    print thisfunction.name + " starting..."
    ...

def DBworker_thatdoes_cleaning18():
    print thisfunction.name + " starting..."
    ...

Hinweis: Ich habe bereits Wie bekomme ich einen Funktionsnamen als Zeichenfolge in Python?, aber das weiß ich nicht wirklich Sehen Sie hier einen schönen Weg, dies zu tun. Diese Frage steht auch in der Nähe von Bestimmen Sie den Funktionsnamen von innen Diese Funktion (ohne Verwendung von Traceback) wurde hier jedoch auf den spezifischen Anwendungsfall der Protokollierung von Funktionsnamen beim Start und Ende angewendet, also nicht genau ein Duplikat.

2
Basj 18 Apr. 2018 im 17:27

3 Antworten

Beste Antwort

Sie könnten einen Dekorateur verwenden:

def start_finish(f):
    def new_f(*args, **kwargs):
        print("starting", f.__name__)
        f(*args, **kwargs)
        print("finished", f.__name__)
    return new_f

@start_finish
def function():
    print('function body')

function()

Dies druckt:

starting function
function body
finished function
5
hiro protagonist 18 Apr. 2018 im 14:33

Sie haben mehr Spielraum, um Ihre Funktion anzupassen, wenn Sie eine aufrufbare Funktion manuell implementieren, d. H. Indem Sie eine Klasse mit einer __call__ -Methode erstellen.

>>> class foo(object): # or class foo: in Python 3
...     def __call__(self):
...         # your logic goes here
...         print(type(self).__name__)
... 
>>> foo = foo()
>>> foo()
foo
0
timgeb 18 Apr. 2018 im 14:32

Vielleicht ein Dekorateur?

def log_function_start(fn):
    def wrapper(*args, **kwargs):
        print '{} starting...'.format(fn.__name__)
        fn(*args, **kwargs)
    return wrapper

@log_function_start
def DBworker_thatdoes_job7():
    ...
2
0x5453 18 Apr. 2018 im 14:33