简体   繁体   中英

Is it possible to assign a default value when unpacking?

I have the following:

>>> 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

I would like to have second default to None if the string does not have any white space. I currently have the following, but am wondering if it can be done in one line:

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

May I suggest you to consider using a different method, ie partition instead of split :

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

If you are on python3, you have this option available:

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

A general solution would be to chain your iterable with a repeat of None values and then use an islice of the result:

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)

this would fill in missing values with None , if you need this kind of functionality a lot you can put it into a function like this:

def fill_iter(it, size, fill_value=None):
    return islice(chain(it, repeat(fill_value)), size)

Although the most common use is by far for strings which is why str.partition exists.

Here's one general solution to unpack tuple and use default value if tuple is shorter than expected:

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

You could try this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM