0

optparse モジュールには、パスの値を取るオプションがあります (ビルドなど)。

問題: このオプションが None かどうかを確認しましたが、--build=None を渡すと失敗します。理由: optparse のデフォルトの型が文字列であるため、build='None' を設定します。つまり、値が None の文字列型として設定されます。

1 つの方法は eval() メソッドを使用することですが、誰かが正当なパスを提供すると失敗します。

しかし、デフォルトで文字列入力を受け取る他のすべてのオプションについても、それを行う必要があります。より良い方法はありますか?親切にアドバイス。

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(つまり、 type のオブジェクト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 に答える