2012-10-14 168 views
5

我有以下Python代码:Python如何在分隔符不存在时处理分割?

def split_arg(argv): 
    buildDescriptor = argv[1] 
    buildfile, target = buildDescriptor.split("#") 

    return buildfile, target 

,预计形式buildfile#target的字符串(argv[1]),并将其分成了两个同名的变量。所以像“my-buildfile#some-target”这样的字符串将分别分解为my-buildfilesome-target

虽然有时候不会有“#”和目标;有时你只需要“my-buildfile”,在这种情况下,我只想目标为“”(空)。

我该如何修改这个函数,以便它能够处理“#”不存在的实例,并返回带有空目标的构建文件?

目前,如果我通过只是构建文件,它抛出一个错误:

buildfile, target = buildDescriptor.split("#") 
ValueError: need more than 1 value to unpack 

提前感谢!

+0

使用鸭子打字,尝试做你想要的,并捕捉异常。 –

+0

感谢您的建议,但鸭子打字是什么? – IAmYourFaja

+0

鸭打字是最适合Python程序的编程技术之一,只是谷歌“python鸭打字”。 –

回答

6

首先,将在列表中分裂的结果:

split_build_descriptor = buildDescriptor.split("#") 

然后检查有多少要素有:

if len(split_build_descriptor) == 1: 
    buildfile = split_build_descriptor[0] 
    target = '' 
elif len(split_build_descriptor) == 2: 
    buildfile, target = split_build_descriptor 
else: 
    pass # handle error; there's two #s 
8

我会用显而易见的方法:

buildfile, target = buildDescriptor.split("#") if \ 
         "#" in buildDescriptor else \ 
         (buildDescriptor, "") 

请注意,当buildDescriptor中有多个“#”时,这也会抛出一个Exception(这通常是一个GOOD东西!)

2
>>> buildfile, _, target = "hello#world".partition("#") 
>>> buildfile, target 
('hello', 'world') 
>>> buildfile, _, target = "hello".partition("#") 
>>> buildfile, target 
('hello', '') 
+0

+1,.partition()在这里看起来非常优雅(除了虚拟变量),但当有多个“#”时它可能会表现出奇怪的(未被注意到)。 – ch3ka