2009-05-28 9 views
32

Ich habe eine Methode, die ich entweder eine einzelne Zeichenfolge (ein Pfad, aber nicht unbedingt eine, die auf dem Computer mit dem Code vorhanden ist) akzeptieren kann) oder eine Liste/Tupel von Strings.Überprüfen, ob die Eingabe eine Liste/Tupel von Strings oder eine einzelne Zeichenfolge ist

Da Zeichenfolgen als Listen von Zeichen fungieren, wie kann ich feststellen, welche Art die Methode erhalten hat?

Ich möchte in der Lage sein, entweder Standard-oder Unicode-Strings für einen einzigen Eintrag zu akzeptieren, und entweder Listen oder Tupel für mehrere, so scheint nicht die Antwort, es sei denn, ich verpasse einen cleveren Trick mit es (wie die gemeinsamen Vorfahren Klassen nutzen?).

Python-Version ist 2,5

+2

Abtastwerteingang/macht Ausgang solche Fragen viel einfacher –

+0

Hier ist die einfache Antwort http://stackoverflow.com/a/26797718/99834 zu interpretieren - ist aufgrund der py2-3-Änderungen nicht offensichtlich. – sorin

Antwort

44

Sie können überprüfen, ob eine Variable ein String oder Unicode ist Zeichenfolge mit

isinstance(some_object, basestring) 

Diese True für beide Strings und Unicode-Strings zurück

Edit:

Sie so etwas tun könnte :

if isinstance(some_object, basestring): 
    ... 
elif all(isinstance(item, basestring) for item in some_object): # check iterable for stringness of all items. Will raise TypeError if some_object is not iterable 
    ... 
else: 
    raise TypeError # or something along that line 

Stringness ist wahrscheinlich kein Wort, aber ich hoffe, dass Sie die Idee

+0

Aha! Ich dachte, irgendwo müsse eine gemeinsame Abstammung sein, ich konnte die Referenz nicht finden ... – mavnn

1

Haben Sie varargs Syntax in Betracht gezogen? Ich bin nicht wirklich sicher, ob das das ist, was Sie fragen, aber würde etwas wie this question entlang Ihren Linien sein?

+0

Würde das nicht nur zwingen, den Anrufer anzugeben, was gesendet wurde? Ich würde es lieber vermeiden, wenn möglich. (Und mich interessiert auch, ob das, was ich machen möchte, auf elegante Weise möglich ist ...) – mavnn

3

Überprüfen Sie den Typ mit isinstance (arg, basestring)

11

Typprüfung erhalten:

def func(arg): 
    if not isinstance(arg, (list, tuple)): 
     arg = [arg] 
    # process 

func('abc') 
func(['abc', '123']) 

varargs:

def func(*arg): 
    # process 

func('abc') 
func('abc', '123') 
func(*['abc', '123']) 
5

isinstance ist eine Option:

In [2]: isinstance("a", str) 
Out[2]: True 

In [3]: isinstance([], str) 
Out[3]: False 

In [4]: isinstance([], list) 
Out[4]: True 

In [5]: isinstance("", list) 
Out[5]: False 
5

Wie Ich mag Dinge einfach zu halten, hier ist die kürzeste Form, die sowohl mit 2.x und 3.x kompatibel:

# trick for py2/3 compatibility 
if 'basestring' not in globals(): 
    basestring = str 

v = "xx" 

if isinstance(v, basestring): 
    print("is string") 
-1

Sie tun können, nicht:

(i == list (i) or i == tuple (i)) 

Es würde antworten wenn die Eingabe Tupel oder Liste ist. Das einzige Problem ist, dass es mit einem Tupel, das nur eine Variable enthält, nicht richtig funktioniert.

3
>>> type('abc') is str 
True 
>>> type(['abc']) is str 
False 

Dieser Code mit Python kompatibel ist 2 und 3

Verwandte Themen