12

現在、私のパッケージの 1 つは JSON パーサー/エンコーダーを必要とし、必要に応じてモジュール (標準ライブラリー内) にsimplejsonフォールバックできる場合に使用するように設計されています (ベンチマークが示すように、より高速です)。jsonsimplejson

ただ、最近はgithubへの移行に伴い、simplejson使用時にインストールするかどうかで当たり外れがあると思います。zc.buildout疑問に思いました。私のファイルでオプションのパッケージを定義することは可能setup.pyですか?

4

2 に答える 2

18

インストール時のオプション パッケージ。

私はあなたがあなたのsetup.pyスクリプトについて話していると仮定しています。次のように変更できます。

# mypackage/setup.py

extras = {
   'with_simplejson': ['simplejson>=3.5.3']
}

setup(
    ...
    extras_require=extras,
    ...)

次に、次のいずれかを実行できます。

  • pip install mypackage
  • pip install mypackage[with_simplejson]

後者のインストールでsimplejson>=3.5.3

すべてをインストールして既知の適切なバージョンにフォールバックしようとする代わりに、動作することがわかっているパッケージのサブセットをインストールすることをお勧めします。

実行時のオプション パッケージ。

インストールできるパッケージの 2 つの異なるセットを取得したら、それらが利用可能であれば、それらを使用できることを確認する必要があります。たとえば、jsonインポートの場合:

try:
    # helpful comment saying this should be faster.
    import simplejson as json
except ImportError:
    import json

別のより複雑な例:

try:
    # xml is dangerous
    from defusedxml.cElementTree import parse
except ImportError:
    try:
        # cElementTree is not available in older python
        from xml.cElementTree import parse
    except ImportError:
        from xml.ElementTree import parse

しかし、いくつかのパッケージでこのパターンを見つけることもできます:

try:
    optional_package = None
    import optional.package as optional_package
except ImportError:
    pass

...

if optional_package:
    # do addtional behavior
于 2014-07-08T19:47:06.133 に答える
-2

AFAIKには、オプションのパッケージを定義する方法はなく、そうすることもできません。オプションのパッケージを定義するとき、あなたは何を期待しますか?まだ利用できないときにインストールされているということですか?(それはどういうわけかそれを必須にするでしょう)

いいえ、私見では、これに対処する正しい方法は、パッケージを使用するインポートにあります。例えば:

try:
    from somespecialpackage import someapi as myapi
except ImportError:
    from basepackage import theapi as myapi

もちろん、これには2つのAPIに互換性がある必要がありますが、これはsimplejson標準ライブラリjsonパッケージの場合です。

于 2012-06-28T08:03:00.610 に答える