拆包时是否可以指定默认值?

时间:2016-07-29 19:33:55

标签: python python-3.x iterable-unpacking

我有以下内容:

>>> myString = "has spaces"
>>> first, second = myString.split()
>>> myString = "doesNotHaveSpaces"
>>> first, second = myString.split()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack

如果字符串没有任何空格,我希望second默认为None。我目前有以下内容,但我想知道是否可以在一行中完成:

splitted = myString.split(maxsplit=1)
first = splitted[0]
second = splitted[1:] or None

4 个答案:

答案 0 :(得分:12)

我建议您考虑使用其他方法,即partition代替split

>>> myString = "has spaces"
>>> left, separator, right = myString.partition(' ')
>>> left
'has'
>>> myString = "doesNotHaveSpaces"
>>> left, separator, right = myString.partition(' ')
>>> left
'doesNotHaveSpaces'

如果您使用的是python3,则可以使用此选项:

>>> myString = "doesNotHaveSpaces"
>>> first, *rest = myString.split()
>>> first
'doesNotHaveSpaces'
>>> rest
[]

答案 1 :(得分:2)

一般解决方案是使用chain chosen个值来repeat您的iterable,然后使用islice结果:

None

这将填充from itertools import chain, islice, repeat none_repat = repeat(None) example_iter = iter(range(1)) #or range(2) or range(0) first, second = islice(chain(example_iter, none_repeat), 2) 的缺失值,如果您需要这么多功能,可以将它放入这样的函数中:

None

虽然最常见的用途是字符串,这就是str.partition存在的原因。

答案 2 :(得分:0)

这是解开元组并在元组短于预期值时使用默认值的一种通用解决方案:

unpacker = lambda x,y=1,z=2:(x,y,z)

packed = (8,5)
a,b,c = unpacker(*packed)
print(a,b,c) # 8 5 2

packed = (8,)
a,b,c = unpacker(*packed)
print(a,b,c) # 8 1 2

Play with this code

答案 3 :(得分:-1)

你可以试试这个:

NUM2UNPACK=2   
parts = myString.split()    
first, second = parts+[None]*(NUM2UNPACK-(len(parts)))