我已经碰到过好几次了.我正在处理许多可以接受字符串列表的方法.有几次我意外地传递了一个字符串,它被分解成一个列表并且每个字符被使用,这不是所希望的行为.
def test(a,b):
x = []
x.extend(a)
x.extend(b)
return x
x = [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)
我不想发生什么:
test(x,'test')
[1, 2, 3, 4, 't', 'e', 's', 't']
Run Code Online (Sandbox Code Playgroud)
我不得不求助于一种奇怪的语法:
test(x,['list'])
Run Code Online (Sandbox Code Playgroud)
我希望这些隐含地工作:
test(x,'list')
[1, 2, 3, 4, 'test']
test(x,['one', 'two', 'three'])
[1, 2, 3, 4, 'one', 'two', 'three']
Run Code Online (Sandbox Code Playgroud)
我真的觉得有一个"pythonic"的方式来做这个或涉及鸭子打字的东西,但我没有看到它.我知道我可以使用isinstance()来检查它是否是一个字符串,但我觉得有更好的方法.
编辑:我正在使用python 2.4.3
S.L*_*ott 10
用这个
def test( x, *args ):
Run Code Online (Sandbox Code Playgroud)
现在你可以做到
test( x, 'one' )
Run Code Online (Sandbox Code Playgroud)
和
test( x, 'one', 'two' )
Run Code Online (Sandbox Code Playgroud)
和
test( x, *['one', 'two',] )
Run Code Online (Sandbox Code Playgroud)
我很遗憾地说,但这确实是少数使用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
Run Code Online (Sandbox Code Playgroud)
或者用于Python 2.x测试isinstance(b, basestring).
嗯,这可能是简单的方法:
>>> 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]
Run Code Online (Sandbox Code Playgroud)