web-dev-qa-db-ja.com

Pythonモジュールの構成を処理する方法、特にスタンドアロンで使用する場合、およびDjango

ここのガイド に従って、pipのPythonモジュールをパッケージ化しようとしています。

フィードバックをお願いしたい領域の1つは、モジュールを構成可能にするためのベストプラクティスまたは規則です。このモジュールは、統合されたRESTfulサービス/ローカルデータストアと通信するためのライブラリであり、コマンドラインライブラリとDjangoアプリの両方として使用します。だから私はそれが手動で構成可能であることとDjangoのsettings.pyファイルから構成可能であることを望みます。

これを行う現在の方法は恐ろしいです-これは、ライブラリ内の一連のsettings.pyファイルに依存しており、gitからプルするたびに上書きされ、実行時などには変更できません。

私の解決策のアイデアは、ライブラリ全体を独自のクラスでラップし、__init__メソッドで次のようにすることです。

try:
    from Django.conf import settings
    self._remote_Host = settings.REMOTE_Host
except:
    self._remote_Host = DEFAULT_Host

しかし、それはDjangoを処理するだけのようで、扱いにくいようです-誰かが私たちのライブラリをFlaskで使用したい場合はどうでしょうか? Pythonモジュールを外部ツールで構成可能にし、デフォルトを設定するより一般的な方法はありますか?またはこれは失われた原因であり、私は引数を介してinitの設定に固執する必要がありますか?

5
user

ここに一緒に来る2つの問題があります。

  1. パッケージはシングルトンですが、さまざまな構成が存在します。
  2. データの保存場所と移行方法-使用するデータベース。

シングルトン

自分で構成を必要とする多くのモジュールで楽しいプロジェクトを行いました。プロジェクトは、コンピュータごとに1回実行することを目的としていました

代わりに、すべてをクラスに入れ、構成を使用してインスタンス化します。 Tistは、1つのプログラム内に多くの異なる構成が存在できるようにします。これが必要な場合は、コード全体を再構築する必要があります。

データベース

多分あなたのプロジェクトは会社のためであり、より長い期間のために開発され、構成は捨ててはなりません。次に、デフォルト値を変更して構成を更新するときに、以前の多くの構成に留意する必要がある場合があります。適切なデータベースはその問題を解決しました。

私のトレードオフソリューション

私の場合

  • モデルが変更された場合、構成は破棄されます。
  • パッケージは、プロセスごとに1回だけでなく、コンピューターごとにも1回実行されます。
  • 1つのスレッドのみが構成にアクセスします。

次のメソッドを持つ config.py というモジュールがあります。

import config
config.load()
config.save()

次のように使用します(例1):

config.load()
config.my_value = 'test'
config.save()

constants.py というファイルもあり、default_config.pyと呼ぶ方がよいでしょう。それは機能を持っています

import constants
constants.default_configuration()
constants.config_file_name() # where to store the config data

(例1)の場合、constants.pyは次のようになります。

def default_configuration():
    return {'my_value' : 'default'} # to avoid attribute errors

Configモジュールは、pickleを使用して構成を保存およびロードします。変数の構成が見つからない場合は、デフォルトの構成が使用されます。

常にconfig.pyから設定を取得するコーディングスタイルが必要です。変更される可能性があるため、ローカル変数または属性に長期間保存しないでください。

以前のバージョンは runningConfiguration と呼ばれています。明示的なロードと保存、およびデフォルトの属性はありません。

3
User

TL; DR:initで引数として渡します。ライブラリの使用と、それらのライブラリを使用せず、使用したくない他のユーザーが表す制限要因とのバランスをとります。

プロジェクトが使用するライブラリ(特に、configやdbなどのポリシーを規定するライブラリ)の数と、ライブラリを使用できる/使用したい人々の集団との間には逆相関があるという一般的な経験則があります。

たとえば、Djangoでのみ機能するライブラリを作成する場合、Djangoユーザーのみに制限されます。構成、特定のデータベースなどでも同じです。

ポリシーを指示しない依存ライブラリはそれほど影響力がありませんが、影響がないという意味ではありません。これらの種類の依存ライブラリを使用したくない理由は、おそらくギャンビットを実行するでしょう:

  • プログラムのサイズを最小限に抑える(これが理由である可能性があります)
  • セキュリティ上の問題
  • コンプライアンスの問題
  • 競合する別の依存ライブラリを使用する必要がある
  • 依存ライブラリの異なるバージョンを使用する必要があります

これらの理由から、常に他のライブラリへの依存を最小限に抑えることをお勧めします。この場合、それはinitで引数を渡すことを意味し、ライブラリのコンシューマがどのように、どのconfigを使用するかを決定できるようにします。

2
dietbuddha