[英]Check if input is a list/tuple of strings or a single string
我有一種方法,我希望能夠接受單個字符串(路徑,但不一定存在於運行代碼的機器上)或字符串列表/元組。
鑒於字符串充當字符列表,我如何知道該方法收到了哪種類型?
我希望能夠接受單個條目的標准或 unicode 字符串,以及多個列表或元組,所以 isinstance 似乎不是答案,除非我錯過了一個巧妙的技巧(比如共同祖先類的優勢?)。
Python 版本是 2.5
您可以使用以下命令檢查變量是字符串還是 unicode 字符串
isinstance(some_object, str)
isinstance(some_object, basestring)
這將為字符串和 unicode 字符串返回True
當您使用 python 2.5 時,您可以執行以下操作:
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
字符串可能不是一個詞,但我希望你能明白
isinstance
是一個選項:
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
類型檢查:
def func(arg):
if not isinstance(arg, (list, tuple)):
arg = [arg]
# process
func('abc')
func(['abc', '123'])
可變參數:
def func(*arg):
# process
func('abc')
func('abc', '123')
func(*['abc', '123'])
由於我喜歡保持簡單,這是與 2.x 和 3.x 兼容的最短形式:
# trick for py2/3 compatibility
if 'basestring' not in globals():
basestring = str
v = "xx"
if isinstance(v, basestring):
print("is string")
>>> type('abc') is str
True
>>> type(['abc']) is str
False
此代碼與 Python 2 和 3 兼容
我很驚訝沒有人用鴨子打字給出答案,而是給出了不清楚或高度依賴於類型或依賴於版本的答案。 此外,不幸的是,接受的答案有 Python 2 和 3 的單獨代碼。 Python 使用並鼓勵鴨子類型,所以(比 sorin 的“最短形式”多一行,而不是鴨子類型)我建議:
def is_str(v):
return hasattr(v, 'lower')
...以及您想使用的任何其他屬性(記住引號)。 這樣,使用您的軟件的客戶端代碼可以發送他們想要的任何類型的字符串,只要它具有您的軟件所需的接口。 鴨子類型以這種方式對其他類型更有用,但它通常是最好的方式。
或者你也可以這樣做(或者通常檢查 AttributeError 並采取一些其他措施):
def is_str(v):
try:
vL = v.lower()
except AttributeError:
return False
return True
使用 isinstance(arg, basestring) 檢查類型
您是否考慮過varargs
語法? 我不確定這是否是您要問的問題,但是像這樣的問題會符合您的要求嗎?
你不能這樣做:
(i == list (i) or i == tuple (i))
如果輸入是元組或列表,它會回復。 唯一的問題是它不能在只包含一個變量的元組中正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.