方法中使用单个字符串或字符串列表
我遇到过这个问题好几次了。我在处理很多可以接受字符串列表的方法。有几次我不小心传了一个单独的字符串,结果它被拆分成了一个列表,每个字符都被当成了一个元素,这样的结果并不是我想要的。
def test(a,b):
x = []
x.extend(a)
x.extend(b)
return x
x = [1,2,3,4]
我不想要发生的情况:
test(x,'test')
[1, 2, 3, 4, 't', 'e', 's', 't']
我不得不使用一种奇怪的语法:
test(x,['list'])
我希望这些能自动工作:
test(x,'list')
[1, 2, 3, 4, 'test']
test(x,['one', 'two', 'three'])
[1, 2, 3, 4, 'one', 'two', 'three']
我真的觉得应该有一种“pythonic”的方式来处理这个问题,或者是和鸭子类型有关的东西,但我没有找到。我知道我可以用isinstance()来检查它是否是字符串,但我觉得还有更好的方法。
编辑:我使用的是python 2.4.3
6 个回答
9
很抱歉这样说,但这确实是少数几个使用 isinstance()
合理的情况之一。不过,有个其他的回答建议检查 list
,这个方向是反的:str
(在 Python 2.x 中还有 unicode
)是特殊的类型,所以我们应该检查这些类型:
def test(a,b):
x = []
if isinstance(b, str): b = [b]
x.extend(a)
x.extend(b)
return x
或者在 Python 2.x 中检查 isinstance(b, basestring)
。
13
使用这个
def test( x, *args ):
现在你可以这样做
test( x, 'one' )
还有
test( x, 'one', 'two' )
以及
test( x, *['one', 'two',] )
2
嗯,这可能是个简单的方法:
>>> def a(*args):
... x=[]
... for i in args:
... if '__iter__' in dir(i):
... x+=list(i)
... else:
... x.append(i)
... return x
...
>>> a(1,2,3,4)
[1, 2, 3, 4]
>>> a(1,2,[3,4])
[1, 2, 3, 4]
>>> a(1,2,[3,4],'123')
[1, 2, 3, 4, '123']
>>> a(1,2,[3,4],'123', 1231, (1, 2, 3, 4))
[1, 2, 3, 4, '123', 1231, 1, 2, 3, 4]