2017-04-21 5 views
0

Ich versuche, zu implementieren, um Funktionalität in Python zu wechseln.Implementieren Sie Switch in Python

Beispiel:

>>> def f(x): 
     return { 
      'report/1/client_1_2001.txt':'10.7.0.151 -> 10.7.0.152', 
      'report/1/client_1_3001.txt':'10.7.0.151 -> 10.7.0.153', 
     }.get(x,'No mapping') 

>>> f('report/1/client_1_3001.txt') 
'10.7.0.151 -> 10.7.0.153' 

ich eine separate Funktion geschrieben haben, die die Kombinationen alle

druckt
def msg(): 
    for x in range(1,9): 
     for j in range(1,9): 
      if x == j: 
       continue 
      else: 
       print "'report/%s/client_%s_%s00%s.txt':'10.7.0.15%s -> 10.7.0.15%s'"%(x,x,j,x,x,j) 

ich oben Funktion innerhalb einer anderen Funktion nenne

def f(x): 
    return {msg()}.get(x,'No mapping') 

Wenn ich versuche um damit auf den Wert zuzugreifen:

print f('report/2/client_2_1002.txt') 

Ich sehe diesen Fehler:

return {msg()}.get(x,'No mapping') 
AttributeError: 'set' object has no attribute 'get' 

Kann mir jemand mitteilen, ob ich etwas bin hier fehlt?

+1

Was erwarten Sie 'get' es zu tun? Du hast ein Set erstellt. Sets bieten keine Möglichkeit, bestimmte Elemente zu erhalten. – BrenBarn

+0

Kann ich den Wert der Funktion msg() trotzdem im selben Format ersetzen wie beim Drucken der Ausgabe? damit ich nicht alles in def def (x) -Funktion schreiben muss, ist es mein Ziel, '10 .7.0.151 -> 10.7.0.153'' zu erhalten, wenn ich' f ('report/1/client_1_3001. txt ') 'wie oben in" Beispiel "gezeigt. –

+1

Ändern Sie 'msg', um ein Diktat zu erstellen, anstatt eine Menge Dinge zu drucken. –

Antwort

1

Ändern Sie msg, um ein Diktat zu erstellen, anstatt eine Menge Zeug zu drucken.

def f(x): 
    return getmsg().get(x,"No mapping") 
def getmsg(): 
    d = {} 
    for x in range(1,9): 
     for j in range(1,9): 
      if x == j: 
       continue 
      else: 
       d['report/%s/client_%s_%s00%s.txt' % (x,x,j,x)] ='10.7.0.15%s -> 10.7.0.15%s'%(x,j) 
    return d 

in Resultierende:

>>f('report/1/client_1_3001.txt') 

'10.7.0.151 -> 10.7.0.153' 

Oder den verschachtelten Aufruf f und getmsg vermeiden und erfordern ein Argument in der getmsg Funktion:

def getmsg(val): 
    d = {} 
    for x in range(1,9): 
     for j in range(1,9): 
      if x == j: 
       continue 
      else: 
       d['report/%s/client_%s_%s00%s.txt' % (x,x,j,x)] ='10.7.0.15%s -> 10.7.0.15%s'%(x,j) 
    return d.get(val,"No mapping") 

Ausgänge:

enter image description here

Hinweis: Es scheint überflüssig, dieses Diktat jedes Mal neu zu erstellen, wenn Sie die Funktion aufrufen, und es gibt wahrscheinlich bessere Möglichkeiten, dies zu tun. :)

Eine Möglichkeit, Sie könnten dies zu tun (und ich bin keineswegs ein Experte mit Python) ist durch eine Class Instanziieren die die Abbildung enthält. Auf diese Weise erstellen wir das Mapping dict in der Prozedur __init__, so dass wir, egal wie oft wir das Mapping anfordern, das Dict nicht jedes Mal neu erstellen.

class Map(): 
    def __init__(self): 
     self.mapping = self.getmapping() 
    def find(self,x): 
     return self.mapping.get(x,"not mapped") 
    def getmapping(self): 
     d = {} 
     for x in range(1,9): 
      for j in range(1,9): 
       if x == j: 
        continue 
       else: 
        d['report/%s/client_%s_%s00%s.txt' % (x,x,j,x)] ='10.7.0.15%s -> 10.7.0.15%s'%(x,j) 
     return d 

es thusly verwenden:

enter image description here

+0

Vielen Dank @David! –

1

ändern msg ein Wörterbuch zurück:

import itertools as it 

def msg(): 
    return {'report/{x}/client_{x}_{y}00{x}.txt'.format(x=x, y=y): 
      '10.7.0.15{x} -> 10.7.0.15{y}'.format(x=x, y=y) 
      for x, y in it.product(range(1,9), repeat=2) if x != y} 
Verwandte Themen