2012-04-07 92 views
0

在optparse模块中,我有一个选择路径值(比如build)的选项。如何将字符串输入处理为'None'作为Nonetype

问题:我已经检查过这个选项是否为None,但是如果通过了--build = None则失败。 原因:原因是optparse的默认类型是字符串,所以它将build ='None'设置为字符串类型,值为None。

的一种方法是使用eval()方法,但如果有人提供一个合法的路径 或者我可以做 失败,如果构建或build.lower()==“无”:

但后来我对于所有其他选项也是如此,默认情况下需要输入字符串。有没有更好的办法? 请咨询。

+0

我觉得它不是'NONE',你可以在你的'dictionary'查找,看看有什么'function'你可以使其尽快映射'string'投入使用'dictionary'的功能,呼叫。但是由于它来自命令行参数,我认为最好坚持'optparse',甚至是'argparse':http://docs.python.org/library/argparse.html#module-argparse – George 2012-04-07 21:13:24

+0

我们可以看到代码? – 2012-04-07 22:27:54

回答

2

我有点困惑问题是什么......下面是我把一些代码放在一起。

>>> import optparse 
>>> import shlex 
>>> parser = optparse.OptionParser() 
>>> parser.add_option('--build',type=str,default=None) 
<Option at 0x...: --build> 

在“命令行”上提供--build选项。

>>> options, args = parser.parse_args(shlex.split("--build=None")) 
>>> print options 
{'build': 'None'} 
>>> options.build is None 
False 
>>> options, args = parser.parse_args(shlex.split("")) 

上的“命令行”

>>> print options 
{'build': None} 
>>> options.build is None 
True 

没有给出--build选项正如你可以看到,如果--build不设置在命令行上,则默认为None(即物体与NoneType类型)。如果提供构建并且字符串==“无”,则返回字符串“None”。

如果您坚持在命令行上传递--build=None,那么您希望optparse处理该标志有点含糊不清。例如,如果它是一个路径,你可以编写一个函数来检查路径是否存在:例如

import os.path 
def path_exists(p): 
    if(os.path.exists(p)): return p 
    else: return None 
... 
parser.add_option('--build',type=path_exists,default=None) 

当然,path_exists可以像您希望它为您的应用程序一样复杂。

0

如果由于某种原因,mgilson的答案没有用,因为您需要默认值为None或其他明显的非值;例如,如果你想让defautl成为像~/.foorc这样的东西,我倾向于使用的解决方案是添加一个不同的“关闭”选项,通常在前面添加一个否定。

>>> import optparse 
>>> import shlex 
>>> parser = optparse.OptionParser() 
>>> parser.add_option('--build', type=str, default="~/.foorc") 
<Option at 0x...: --build> 
>>> parser.add_option('--no-build', 
...     dest="build", 
...     action="store_const", 
...     const=None) 
<Option at 0x...: --no-build> 

合理的默认,选项都是可选的,毕竟

>>> options, args = parser.parse_args(shlex.split("")) 
>>> print options 
{'build': '~/.foorc'} 
>>> options.build 
'~/.foorc' 

可与--no-build选项被禁用:

>>> options, args = parser.parse_args(shlex.split("--no-build")) 
>>> print options 
{'build': None} 
>>> options.build is None 
True 

当然,你仍然可以覆盖默认。

>>> options, args = parser.parse_args(shlex.split("--build=something")) 
>>> print options 
{'build': 'something'} 
>>> options.build 
'something' 
相关问题