2016-06-02 11 views
2

Ich entwickle einen Bot auf Python (2.7, 3.4). Ich habe ungefähr 30 dynamische Funktionen definiert, die basierend auf Bot-Befehlen verwendet werden können. Während die Entwicklung, da nicht alle Funktionen fertig sind, habe ich für sie eine leere Funktionen definieren (wenn ich definieren nicht dann Code nicht ausgeführt wird) wie folgt aus:Kann eine Funktion mehrere Namen haben?

def c_about(): 
    return 
def c_events(): 
    return 
def c_currentlocation(): 
    return 

usw. viele Dummy-Funktionen.

Frage:
ist es irgendwie möglich in Python gleiche Funktion zu definieren, aber mit mehreren Namen?
Etwas wie folgt aus:

def c_about(), c_events(), c_currentlocation(): 
    return 
+1

Alternativ können Sie funtion Mapping Wörterbuch definieren: 'cmd = { 'zu'

l = [] for i in range(10): l.append(lambda: None) 

Und Sie jede von ihnen durch Indizes wie l[index]()

Zum Beispiel verweisen können : c_about, ...} '. Dadurch können Sie Befehls- und Funktionsnamen entkoppeln, Ihre Funktionen über Klassen und Packages organisieren und so etwas wie 'cmds.get ('mycommand', dummy_function)' machen, das den Dummy zurückgibt, falls (noch) keine Funktion existiert. –

Antwort

2

Funktionen nicht intern (dh automatisch multiple references zum gleichen unveränderlichen Objekt teilen), können aber den gleichen Name:

>>> def a(): pass 
... 
>>> a 
<function a at 0x101c892a8> 
>>> def b(): pass 
... 
>>> b 
<function b at 0x101c89320> 
>>> c=a 
>>> c 
<function a at 0x101c892a8> # note the physical address is the same as 'a' 

So klar können Sie tun:

Für t er Fall von Funktionen noch nicht definiert sind, können Sie einen try/catch Block durch den Fang verwenden entweder eine NameError:

def default(): 
    print "default called" 

try: 
    not_defined() 
except NameError: 
    default() 

oder ein dict von funcs verwenden und fangen die KeyError:

funcs={"default": default} 

try: 
    funcs['not_defined']() 
except KeyError: 
    funcs['default']()  

Oder können Sie tun funcs.get(not_defined, default)() Wenn Sie diese Syntax mit einem Diktat von Funktionen bevorzugen.

3

Ja, es ist durchaus möglich, da definierte Funktionen sonst in Variablen wie alles gespeichert sind.

def foo(): 
    pass 

baz = bar = foo 

Es gibt noch einige Metadaten in die ursprüngliche Funktion beziehen (help(bar) noch foo erwähnen), aber es hat keinen Einfluss auf Funktionalität.

Eine weitere Option ist lambda s für Einzeiler zu verwenden:

foo = bar = baz = lambda: None 
1

Ja, es ist möglich, und es ist sogar möglich, sie in Listen mit Schleifen zu speichern. Zum Beispiel:

c_events = 0 
c_about = 1 
l[c_events]() 
Verwandte Themen