2012-04-07 16 views
0

optparseモジュールでは、パスの値(ビルドなど)を取るオプションがあります。文字列入力を「なし」として処理する方法Nonetype

問題:このオプションが[なし]であることを確認しましたが、失敗した場合は--build = Noneになります。 理由:optparse isのデフォルトの型はstringなので、build = 'None'、つまり値なしの文字列型を設定します。 )

一つの方法は、evalの()メソッドを使用することです誰かが合法的なパス を提供する場合、それは失敗するか、私は(ビルドまたはbuild.lower場合 を行うことができ==「なし」:

しかし、その後、私は」デフォルトでは文字列入力を受け付ける他のすべてのオプションについても同様です。より良い方法がありますか?親切なアドバイスをお寄せください。

+0

コール。しかし、それはコマンドライン引数から来ているので、私は 'optparse'や' argparse'を使うのが最善だと思います:http://docs.python.org/library/argparse.html#module-argparse – George

+0

コードを見ることはできますか? ? –

答えて

2

私はちょっと混乱しています。問題は...私がまとめたコードです。

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

「コマンドライン」に--buildオプションを指定します。 「コマンドライン」

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

に与えられた

>>> 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オプションあなたが見ることができるように、--buildは、コマンドラインで提供されていない場合は、それ(タイプNoneTypeと、すなわちオブジェクト)Noneデフォルト。 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はアプリケーションにとって必要なほど複雑なものになることがあります。

0

何かの理由で、実際にNoneや他の明らかでない値以外の値がデフォルトになっている必要があるため、mgilsonの答えは有用ではありません。たとえば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 

、あなたはまだ、デフォルトを上書きすることができます。私はあなたがそうとすぐに、それは `NONE`ないよう、` dictionary`を使用して機能するために `STRING`入力をマッピングすることができ、あなたは何に` function`見るためにあなたの `dictionary`でルックアップすることができると思う

>>> options, args = parser.parse_args(shlex.split("--build=something")) 
>>> print options 
{'build': 'something'} 
>>> options.build 
'something' 
関連する問題