方法中的单个字符串或字符串列表

sha*_*and 10 python

我已经碰到过好几次了.我正在处理许多可以接受字符串列表的方法.有几次我意外地传递了一个字符串,它被分解成一个列表并且每个字符被使用,这不是所希望的行为.

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)


Dun*_*can 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
Run Code Online (Sandbox Code Playgroud)

或者用于Python 2.x测试isinstance(b, basestring).


pod*_*tra 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]
Run Code Online (Sandbox Code Playgroud)

  • 在 python3 上,这会失败,因为字符串具有 '__iter__' (2认同)