如何将字符串输入处理为'None'作为Nonetype
问题描述:
在optparse模块中,我有一个选择路径值(比如build)的选项。如何将字符串输入处理为'None'作为Nonetype
问题:我已经检查过这个选项是否为None,但是如果通过了--build = None则失败。 原因:原因是optparse的默认类型是字符串,所以它将build ='None'设置为字符串类型,值为None。
的一种方法是使用eval()方法,但如果有人提供一个合法的路径 或者我可以做 失败,如果构建或build.lower()==“无”:
但后来我对于所有其他选项也是如此,默认情况下需要输入字符串。有没有更好的办法? 请咨询。
答
我有点困惑问题是什么......下面是我把一些代码放在一起。
>>> 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可以像您希望它为您的应用程序一样复杂。
答
如果由于某种原因,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'
我觉得它不是'NONE',你可以在你的'dictionary'查找,看看有什么'function'你可以使其尽快映射'string'投入使用'dictionary'的功能,呼叫。但是由于它来自命令行参数,我认为最好坚持'optparse',甚至是'argparse':http://docs.python.org/library/argparse.html#module-argparse – George 2012-04-07 21:13:24
我们可以看到代码? – 2012-04-07 22:27:54