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

nev*_*gqs 11 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
Run Code Online (Sandbox Code Playgroud)

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

splitted = myString.split(maxsplit=1)
first = splitted[0]
second = splitted[1:] or None
Run Code Online (Sandbox Code Playgroud)

wim*_*wim 15

我建议你考虑使用不同的方法,即partition代替split:

>>> myString = "has spaces"
>>> left, separator, right = myString.partition(' ')
>>> left
'has'
>>> myString = "doesNotHaveSpaces"
>>> left, separator, right = myString.partition(' ')
>>> left
'doesNotHaveSpaces'
Run Code Online (Sandbox Code Playgroud)

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

>>> myString = "doesNotHaveSpaces"
>>> first, *rest = myString.split()
>>> first
'doesNotHaveSpaces'
>>> rest
[]
Run Code Online (Sandbox Code Playgroud)


Shi*_*hah 6

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

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
Run Code Online (Sandbox Code Playgroud)

玩一下这个代码


Tad*_*sen 5

一个通用的解决方案是chain使用 a repeatofNone值对您的 iterable 进行迭代,然后使用 aislice结果:

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)
Run Code Online (Sandbox Code Playgroud)

这将用 填充缺失值None,如果您非常需要这种功能,您可以将其放入这样的函数中:

def fill_iter(it, size, fill_value=None):
    return islice(chain(it, repeat(fill_value)), size)
Run Code Online (Sandbox Code Playgroud)

虽然到目前为止最常见的用途是字符串,这就是为什么str.partition存在。