2

インポートを相対ではなく絶対にする方法はありますか?

私は Python 標準ライブラリjsonモジュールを「オーバーライド」しているので、プロジェクトでは常に正しいエンコーダーとパラメーターを使用します。

project/foo/json.py: (このファイル名をマーク)

import json as pyjson

class ComplexEncoder(pyjson.JSONEncoder):
    def default(self, obj):
        if hasattr(obj, 'isoformat'):
            return obj.isoformat()
        else:
            if type(obj) == file:
                return "filestream"
            raise TypeError, 'Object of type %s with value of %s is not JSON serializable' % (type(obj), repr(obj))

def dumps(data):
    return pyjson.dumps(data, cls=ComplexEncoder, check_circular=False, separators=(',', ':'), ensure_ascii=False)

def loads(data):
    return pyjson.loads(data)

このファイルをインポートすると、恐ろしいAttributeError: 'module' object has no attribute 'JSONEncoder'. Aは、Python 標準ライブラリからではなく、ローカル パッケージからインポートするprint(pyjson.__file__)という私の疑いを裏付けています。import json as pyjsonjson

ローカル ディレクトリが無視されるように、インポートを強制的に絶対にする方法はありますか?

4

1 に答える 1

4

「json」モジュールがパッケージ内にある場合、これで修正されます。

from __future__ import absolute_import

その__future__ステートメントを使用すると、インポートはデフォルトで絶対になります。つまり、最上位のモジュールまたはファイルのみを検索しますjson

ローカルのものをインポートする必要がある場合は、 を実行するか、またはimport foo.jsonを使用して相対インポートを明示的に要求できます。from . import jsonfrom .json import dumps

(Python 2 を使用していると仮定しています)。

于 2013-10-14T12:44:44.223 に答える