2009-05-28 8 views
32

Mam metodę, którą chcę zaakceptować jako pojedynczy ciąg (ścieżkę, ale niekoniecznie taką, która istnieje na komputerze z uruchomionym kodem)) lub listę/krotkę łańcuchów.Sprawdź, czy wejście jest listą/krotką ciągów znaków lub pojedynczym ciągiem znaków

Biorąc pod uwagę, że ciągi zachowują się jak listy znaków, w jaki sposób mogę stwierdzić, jakiego rodzaju metoda została otrzymana?

Chciałbym móc zaakceptować standardowe lub unikodowe ciągi znaków dla pojedynczego wpisu, a także listy lub krotki dla wielu, więc isinstance nie wydaje się być odpowiedzią, chyba że brakuje mi sprytnej sztuczki z to (jak korzystanie z klas wspólnych przodków?).

wersja

Python 2.5

+2

wejścia próbki/wyjście sprawia takie pytania znacznie łatwiejsze do interpretacji –

+0

tu prostej odpowiedzi http://stackoverflow.com/a/26797718/99834 - nie jest oczywiste ze względu na zmiany py2-3. – sorin

Odpowiedz

44

Można sprawdzić, czy zmienna jest ciągiem lub Unicode ciąg z

isinstance(some_object, basestring) 

Spowoduje to powrót True dla obu łańcuchów i ciągów unicode

Edit:

Można zrobić coś takiego :

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 

Ciągłość wynosi Prawdopodobnie nie jest to słowo, ale mam nadzieję, że masz pomysł

+0

Aha! Pomyślałem, że gdzieś musi być jakieś wspólne pochodzenie, po prostu nie mogłem znaleźć odniesienia ... – mavnn

1

Czy za varargs składni? Nie jestem do końca pewien, czy o to pytasz, ale czy coś takiego jak this question byłoby zgodne z twoimi liniami?

+0

Czy to nie tylko zmusiłoby dzwoniącego do określenia, które było wysyłane? Wolałbym tego uniknąć, jeśli to możliwe. (I jestem zaintrygowany, czy to, co chcę robić, jest możliwe w elegancki sposób ...) – mavnn

3

sprawdzić typ z isinstance (arg, basestring)

11

Rodzaj sprawdzanie:

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 jest opcja:

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

jak lubię trzymać rzeczy proste, oto najkrótsza forma, która jest kompatybilny zarówno z 2.x oraz 3.x:

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

v = "xx" 

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

Może nie:

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

Byłoby odpowiedzieć jeśli dane wejściowe to krotka lub lista. Jedynym problemem jest to, że nie działa poprawnie z krotką trzymającą tylko jedną zmienną.

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

Kod ten jest zgodny z Python 2 i 3

Powiązane problemy