2017-07-12 24 views
0

In dem Bemühen um eine Strecke von Code aufzuräumen ich so etwas wie dies versuchte:Namespace aus dem Wörterbuch auffüllen?

class ClassDirection(): 
    def __init__(self): 
     pass 

    def downward(self, x): 
     print (x) 

    def upward(self, x): 
     print (X +1) 

    def sideways(self, x): 
     print (x // 2) 

directions = [] 
mustard = ClassDirection() 
dicty = {downward:5, upward:7, sideways:9} 
for a,b in dicty.items(): 
    direction = mustard.a(b) 
    directions.append(direction) 

Sehen als das Wort „nach unten“ von Python verstanden wird als ein Name, der nicht definiert ist, ausgeführt ist es natürlich nicht Geben Sie mir den Fehler:

NameError: name 'downward' is not defined 

Ich habe 2 Fragen dazu. A) Gibt es eine Möglichkeit, einen undefinierten "Namen" in einem Wörterbuch zu speichern, ohne ihn als String zu speichern und dann mit einem verrückten Hack neu zu formatieren? B) Ist es überhaupt möglich, einen Teil eines Namensraums so zu "injizieren"?

+0

Sicher, speichern Sie einfach Zeichenfolgen und verwenden Sie 'getattr()'. Oder speichern Sie die gebundenen Methoden. 'senf.downwards' ist ein Objekt, das Sie in ein Wörterbuch einfügen und später aufrufen können. –

+0

Danke! Getattr ist die Art von Ding, die ich gesucht habe und ich habe viel gelernt, indem ich auf seine Beispiele schaue. Übrigens, ich erkenne, dass der zugrundeliegende Mechanismus in meiner Frage ein Duplikat sein kann, aber der Weg, ihn zu finden, könnte nicht sein. Tatsächlich habe ich ziemlich viel Zeit damit verbracht, hier und im Allgemeinen über Google zu suchen, bevor ich meine Frage gestellt habe. Das Problem war "wie beschreibe ich, wonach ich suche". "Wie kann auf Klasseneigenschaften in Python dynamisch zugegriffen werden?" ist überhaupt nicht, wie ich die Frage betrachtete. – chmedly

Antwort

0
dicty = {mustard.downward: 5, mustard.upward: 7, mustard.sideways: 9} 
for a, b in dicty.items(): 
    direction = a(b) 

Oder:

dicty = {'downward': 5, 'upward': 7, 'sideways': 9} 
for a, b in dicty.items(): 
    direction = getattr(mustard, a)(b) 

Auch ist ein dict nicht wirklich hilfreich hier und bedeutet, dass Sie keine Kontrolle über Auftrag haben. Eher:

dicty = [('downward', 5), ('upward', 7), ('sideways', 9)] 
for a, b in dicty: # no .items() 
+0

Danke! Getattr ist die Art von Ding, die ich gesucht habe und ich habe viel gelernt, indem ich auf seine Beispiele schaue. So weit das Wörterbuch geht: Aus irgendeinem Grund hatte ich das Gefühl, dass es einfacher war, auf die Werte zu dieser Zeit zuzugreifen, da ich die Reihenfolge NICHT verfolgen musste. Aber bei weiterem Nachdenken ist eine einfache Liste wahrscheinlich besser. – chmedly

Verwandte Themen