2012-04-07 48 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'