2016-11-24 3 views
0

Ich möchte einen Typ oder eine Liste von Typen als Argument an eine Funktion übergeben. Aber innerhalb der Funktion muss ich zwischen dem Typ und der Typenliste unterscheiden. Grob erklärt brauche ich eine Art, wie dies der Verzweigung:Wie überprüft man, ob eine Variable einen Typ oder eine Liste von Typen enthält?

if //someVar is a type//: 
    .... 
elif isinstance(someVar, list): 
    for t in list: 
     if //t is a type//: 
      .... 
     else: 
      print("ERROR") 
else 
    print("ERROR") 

Typen können entweder einige „primitiv“ wie int oder str sondern auch als gut Tupel oder Klassen.

Die Frage: Wie kann ich korrekt und effizient zwischen Typen und Typenlisten unterscheiden?

+0

Könnten Sie den weiteren Kontext dessen, was Sie versuchen zu erklären? Haben Sie z.B. 'isinstance' /' issubclass'? – jonrsharpe

+0

müssen Sie explizit nach 'listen' suchen? Auch, was * gilt nicht als Typ für dich? –

+0

Zur Klarstellung: Ich beabsichtige, Typinformationen an eine Typüberprüfungsmethode zu übergeben. Ich möchte dem Benutzer eine Art von Freiheit geben, wie man Typeinschränkungen spezifiziert, die an diese Methode übergeben werden. Daher möchte ich ihm erlauben, entweder einen einzelnen Typ oder eine Liste von Typen (und eventuell einige andere Optionen in der Zukunft) anzugeben. Daher würden die bereitgestellten Informationen in einer einzigen Variablen gespeichert werden. Daher brauche ich eine Art Verzweigung innerhalb des Codes, um korrekt mit den vom Benutzer bereitgestellten Informationen arbeiten zu können. –

Antwort

1

Sie müssen tuple bis isinstance angeben, die Typen enthalten, die Ihrer Meinung nach als "primitiv" gelten. Für Listen werden Sie einfach eine list übergeben.

Wenn Sie „als auch Klassen“ behandeln Sie explizit benötigen, um diese Klassen im Tupel hinzu, da es keine ClassType in Python (zumindest in Python ist 3, in Python 2 im alten Stil Klassen hatten ein gewöhnlicher Typ).

So, da ein Beispiel Klasse Bar, hier, wie Sie str, int s erlauben würde, tuple s und Bar als "primitiv", während weiter für Listen Überprüfung:

class Bar: pass 

def foo(arg): 
    if isinstance(arg, (int, str, tuple, Bar)): 
     print("type str or int or tuple or Bar") 
    elif isinstance(arg, list): 
     print("a list") 
    else: 
     print("Error") 

Funktion foo macht nun diese Unterschiede für Sie:

>>> foo(1) 
type str or int or tuple or Bar 
>>> foo([1]) 
a list 
>>> foo(Bar()) 
type str or int or tuple or Bar 
>>> foo(foo) 
Error 

weiter in der elif Klausel Verzweigung für list s ähnlich ist performe d.

+0

Kein üblicher Typ für Klassen ... Das ist ziemlich unbequem. Ein Teil des Codes kann nicht explizit für alle vorhandenen Klassen überprüft werden. Bitte beachten Sie die oben angegebenen zusätzlichen Informationen als Kommentar zu meiner Frage. Hast du eine Idee, wie du das erreichen kannst? Ich muss explizit zwischen einem Objekt, das einen Typ repräsentiert (zB eine Liste) und einer Instanz dieses Typs (eine Liste von zB Typen) unterscheiden. –

+0

@RegisMay was würde der Benutzer liefern? Sind die Eingaben: 'foo (list)', 'foo (int)' gehören in die Kategorie "single" 'type' und' foo ([int, str, tuple]) 'gehören in die' list' von 'type' s Kategorie? –

+1

Entschuldigung, ja. Jim gab den richtigen Hinweis: Ich kann Tupel oder einzelne Werte an isinstance() übergeben. So kann ich genau das erreichen, was ich will. Ich kann die Verzweigung komplett überspringen, da dies von isinstance() selbst erledigt wird! Danke für deine Antwort, Jim! –

Verwandte Themen