私はいくつかのツールから--verbose
またはを知っており-v
、これを自分のスクリプトやツールに実装したいと考えています。
私は以下を配置することを考えました:
if verbose:
print ...
私のソース コードでは、ユーザーがオプションを渡すと-v
、変数がverbose
設定されTrue
、テキストが印刷されます。
これは正しいアプローチでしょうか、それとももっと一般的な方法があるのでしょうか?
追加: 引数の解析を実装する方法を尋ねているのではありません。それがどのように行われるかはわかっています。特に詳細オプションにのみ興味があります。
ベストアンサー1
私の提案は、関数を使用することです。しかし、if
関数内に を入れたくなるかもしれませんが、代わりに次のようにします。
if verbose:
def verboseprint(*args):
# Print each argument separately so caller doesn't need to
# stuff everything to be printed into a single string
for arg in args:
print arg,
print
else:
verboseprint = lambda *a: None # do-nothing function
(はい、ステートメント内で関数を定義することができif
、条件が true の場合にのみ定義されます!)
Python 3 を使用している場合、 はprint
すでに関数です (または をprint
使用して 2.x で を関数として使用する場合from __future__ import print_function
)、さらに簡単になります。
verboseprint = print if verbose else lambda *a, **k: None
この方法では、フラグを常にテストするのではなく、詳細モードがオフの場合に何もしない関数として定義されます (ラムダを使用) verbose
。
ユーザーが詳細モードを変更できる場合ランニング中プログラムの場合、これは間違ったアプローチになります (if
関数内で が必要になります)。ただし、コマンドライン フラグを使用して設定するため、決定は 1 回だけ行う必要があります。
verboseprint("look at all my verbosity!", object(), 3)
その後、 「詳細な」メッセージを印刷したいときはいつでも、eg を使用します。
-O
スクリプトの「本番」バージョンを起動するときにPython フラグを使用して詳細出力のオン/オフを切り替える (またはPYTHONOPTIMIZE
環境変数を設定する) 場合は、詳細な出力を印刷するすべての場所でフラグをテストするのが良い方法です__debug__
。
if __debug__: print("Verbosity enabled")
最適化なしで実行すると、これらの文が実行されます(if
文の本体だけが残り、 は削除されます)。最適化ありで実行すると、Python は実際にこれらの文を完全に削除します。パフォーマンスにはまったく影響しません。私のブログ投稿__debug__
と-O
より詳細な議論については。