0

在 optparse 模块中,我有一个采用路径值的选项(例如构建)。

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

一种方法是使用 eval() 方法,但如果有人提供合法路径,它会失败或者如果 build 或 build.lower()=='none' 我可以这样做:

但是我也必须为所有其他选项执行此操作,默认情况下采用字符串输入。有没有更好的办法?好心劝告。

4

2 回答 2

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",它返回一个字符串 "None"。

如果您坚持传递--build=None命令行,那么您希望 optparse 对该标志执行的操作有点模棱两可。例如,如果它是一个路径,您可以编写一个函数来检查路径 None 是否存在:例如

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 可以根据您的应用程序所需的复杂程度。

于 2012-04-08T00:19:16.350 回答
0

如果由于某种原因,mgilson 的答案没有用,因为您需要默认值实际上是其他东西,None或者其他一些明显的非价值;例如,如果您希望默认值类似于~/.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'
于 2012-04-08T01:07:55.200 回答