0

Leenert Regebro の回答: どうやら私の直感は正しかったようで、これは不可能です。また、2 時間で回答が 1 つしかないことからも明らかです。コメントもありがとうございます。

私のGoogle-fooは私を失敗させています。

単一のパブリッシャーの下で複数のプロジェクトで使用するために、カスタム例外のライブラリをモジュールとして作成しています。他のプロジェクトでは発言権がないか、発言権があるかもしれません。したがって、それは私と他の人の両方で使用されている可能性があります。「その他」がここでの問題です。私の例外モジュール内には、loggingモジュールを使用してログファイルにトレースバックなどを出力するための特定の関数があります。logging私はモジュール を使用しているので、これは私にとっては問題ありません。

ただし、を使用していない他の誰かがlogging例外ライブラリを使用している場合は、ログの部分をスキップする必要があります。try...except を使用するとこの問題は解決しますが、使用している場合はどうなりloggingますか? この場合、ログ スキーム (コンソール/ファイル/ストリーム、ファイル名など) を特定できる必要があります。これは、サブロガーを作成して、ファイル (またはコンソールまたはあなたが持っているもの) に書き込むことができるようにするためです。 ):

<snip>
their_logger = THE_FUNCTION_I_CANNOT_FIGURE_OUT_HOW_TO_WRITE()
temp_var = their_logger.name + ".ExceptionLogger"
myLogger = logging.getLogger(temp_var)
</snip>

明らかに、モジュールをインスタンス化し、 type のパラメーターを受け取る別のクラスまたは関数を作成することもできますがlogging.logger、可能であれば、これを馬鹿に証明したいと思います。

他のプログラマーが使用しない可能性があるため、私が知っている値globalの a またはdict をチェックすることさえできません。globals()

これを行う方法はありますか?(私のライブラリがインポートされていると仮定すると、おそらくトップレベルのアプリケーションではありません...)個人的には、名前空間のアップストリームからデータを取得して、明示的に渡すことなく下位の名前空間で使用できるようにしようとしたことはありません。可能ですが、多くのプログラマーがいますが、これを達成した人はいますか?

4

1 に答える 1

3

デフォルトでオプションの構成を含めるのは悪い考えです。デフォルトでロギングの詳細を追加し、それを除外するために try/except によって隠されたある種のワイルドな推測を行う代わりに、コードのその部分を関数に入れ、コードから明示的に呼び出します。

あなたはばかを証明することはできません。実際、魔法と隠された論理が多ければ多いほど、それは馬鹿げたものではなくなり、すぐにその代わりに魔法を理解するのが本当に難しくなる知性的なものになります.

したがって、関数を作成し、代わりにロガーを渡すという考えに沿ってください。

于 2013-01-06T17:48:30.183 に答える