2010-12-03 4 views

Répondre

3

J'ai déjà eu un décorateur pour un fichier de script de ligne de commande.

Le décorateur a été utilisé comme ceci:

@command 
def someFunc(): 
    # code goes here 

Le décorateur a fait quelque chose comme ceci:

commands = {} 
def command(func) 
    commands[func.__name__] = func 
    return func 

Et puis je pouvais faire quelque chose comme ceci:

commandName = raw_input() 
commands[commandName](); 

qui lirait le nom d'une commande de la console et l'appelait - si elle était étiquetée avec le décorateur avant (donc pas les appels dangereux seraient possibles comme avec input).

(Dans mon code, le nom a été tiré de la args de ligne de commande, pas raw_input.)

Cela me laisse facilement fournir des commandes accessibles via leur nom. C'est l'une des utilisations - une règle générale serait "c'est utile quand vous voulez ajouter votre propre sémantique à la notion de définition de fonction". La même chose vaut pour les décorateurs en général.

(BTW, il y a champ func.func_name, qui est plus correct à utiliser que func.__name__ parce que les identificateurs commençant par __ sont censés être privés en Python, autant que je sache - un détail mineur)

+0

Très bien, j'ai encore besoin de bien comprendre ce que vous avez dit, merci pour le conseil func.func_name. –

+1

Notez que c'est __name__' sur une fonction; le '__name__' que vous avez trouvé en premier était sur un module, indiquant son nom comme importé, ou' '__main __' 'pour le module appelé initial; dans tous les cas, 'sys.modules [__ name __]' est le module courant. –

1

Il peut être très utile lors du débogage. Lorsque vous écrivez des frameworks (ou tout autre logiciel très générique), vous pouvez facilement déboguer en utilisant le name pour savoir ce qui se passe.

Questions connexes