如何将字符串输入处理为“无”作为Nonetype

时间:2012-04-07 21:05:48

标签: python string optparse nonetype

在optparse模块中,我有一个选项,它采用路径值(比如build)。

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

一种方法是使用eval()方法但如果有人提供合法路径则会失败 或者我能做到   如果build或build.lower()=='none':

但是我要为所有其他选项执行此操作,默认情况下接受字符串输入。有没有更好的办法? 请建议。

2 个答案:

答案 0 :(得分: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(""))

“命令行”上没有--build选项

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

如您所见,如果命令行上未提供--build,则默认为None(即类型为NoneType的对象)。如果提供了构建并且字符串==“无”,则返回字符串“无”。

如果您坚持在命令行上传递--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可能与您希望它的应用程序一样复杂。

答案 1 :(得分: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'