2016-11-02 3 views
1

wir haben AngenommenFunktion gibt entweder Int oder eine Liste von Ints zurück. Assinging die erste auf eine Variable

def f_1(): 
    return (3, 4) 

def f_2(): 
    return 2 

Die Funktionen gegeben sind. Es ist kein Code, den ich ändern kann. Wir wissen, dass sie entweder eine Ganzzahl oder eine Folge von ihnen zurückgeben.

Ich möchte die Rückkehr zu einer Variablen zuweisen, wobei die Variable nur die erste der ganzen Zahlen nehmen sollte, wenn die Rückkehr eine Folge von ihnen ist.

Gibt es ein integriertes syntaktisches Gerät in Python, das mir dies ermöglicht?

for function in [f_1, f_2]: 
    ... 
    x = function()[0] # Works for f_1, breaks for f_2 
    y = function() # Works for f_2, assigns (3, 4) for f_1 while 
         # we really would like only the 3 to be the 
         # assigned value 

Hinweis: Nehmen wir an, wir wissen nicht, welche der Funktionen der Sequenz zurückkehren und welche Rück nur eine Nummer.

Antwort

2

Gibt es eine Build-in syntaktischem Gerät

Nr Die übliche Praxis für forgivness-ask ist:

x = function() 
try: 
    x = x[0] 
except TypeError: 
    pass 
+5

Ein * catch-all * außer wird wahrscheinlich nicht verziehen –

+0

Richtig. Korrigiert das. –

1

ich für try-except-Anweisung gehen würde nicht. Für mich ist es ein Overkill.

Wahrscheinlicher Ich würde versuchen, wie etwas zu tun:

result = function() 
# this can be changed to abc.Sequence for more general approach 
if isinstance(result, (list, tuple)): 
    result = result[0] 
+1

Dies geht jedoch gegen den "besser um Verzeihung als Erlaubnis bitten" -Stil von Python. Ich sage nicht, dass ich deiner Antwort nicht zustimme, aber es wird wahrscheinlich als unidiomatisch angesehen. – Carcigenicate

+0

Das wäre nicht Python. Siehe https://docs.python.org/3/glossary.html#term-eafp –

+1

Ja, ich habe gerade darüber gelesen. Der Punkt ist, was passiert, wenn sie jemals den Fehlertyp von TypeError in irgendeinen anderen ändern würden? Sie müssten den Quellcode ändern, um ihn zu beheben. Ich würde immer noch bei meiner Antwort bleiben, aber ich werde mich erinnern, dass es nicht pythonisch ist. Danke für den Tipp. – Nf4r

1

in die andere Richtung gehen, wickeln f_2 in einer anderen Funktion, um sicherzustellen, dass die Funktion im Körper der Schleife bezeichnet immer eine Sequenz zurückgibt .

for function in [f_1, lambda : (f_2(),)]: 
    x = function()[0] 

Der zusätzliche Overhead eines anderen Funktionsaufrufs kann diesen Ansatz unerwünscht machen.

+0

Sorry, vergessen zu erwähnen, dass ich nicht weiß, welche Funktionen die Liste zurückgeben und welche die Nummer zurückgeben. – myfirsttime1

+0

@ myfirsttime1 Nur aus Neugier, wie kommt es, dass Sie nicht die Rückkehr jeder Funktion wissen? Kehren beide zurück? Gibt es nur eine Liste und die andere eine Nummer? – Carcigenicate

+0

Die Funktionen sind eingegeben. Ich weiß nur, dass sie einen dieser beiden Fälle zurückgeben können, aber nicht wissen, welcher. – myfirsttime1

Verwandte Themen