Заставить импорт Python быть абсолютным (игнорировать локальный каталог пакетов)

Есть ли способ заставить импорт быть абсолютным, а не относительным?

Я «переопределяю» модуль стандартной библиотеки 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'. print(pyjson.__file__) подтверждает мое подозрение, что import json as pyjson импортирует json из локального пакета, а не из стандартной библиотеки Python.

Есть ли способ заставить импорт быть абсолютным, чтобы локальный каталог игнорировался?


person RickyA    schedule 14.10.2013    source источник
comment
Почему бы просто не назвать его другим именем?   -  person aIKid    schedule 14.10.2013
comment
Потому что: A - означает рефакторинг множества вещей. B - у меня была эта проблема пару раз раньше, и теперь мне нужно хорошее универсальное решение.   -  person RickyA    schedule 14.10.2013
comment
Предназначен ли foo/json.py для использования только в вашем коде или он может использоваться внешним кодом, который просто предполагает, что он получает настоящий модуль json? Последнее не кажется особенно безопасным, а первое можно решить, просто выполнив import myjson as json вместо того, чтобы пытаться создать подкласс модуля.   -  person chepner    schedule 14.10.2013
comment
@chepner: я должен воздержаться, чтобы не вставлять сюда некоторые цитаты Matrix относительно реального;) И, поскольку мы все еще используем модуль json по умолчанию, я не вижу здесь небезопасности. Но вы правы, я должен был просто дать ему другое имя. Однако рефакторинг кодовой базы, которая зависит от этого, просто подвержен ошибкам...   -  person RickyA    schedule 14.10.2013


Ответы (1)


Если ваш модуль "json" находится внутри пакета, это исправит это:

from __future__ import absolute_import

С этим оператором __future__ импорт будет абсолютным по умолчанию, то есть он будет искать только модуль или файл верхнего уровня с именем json.

Если вам нужно импортировать свой локальный, вы можете либо сделать import foo.json, либо явно запросить относительный импорт, используя from . import json или from .json import dumps.

(Я предполагаю, что вы используете Python 2).

person user9876    schedule 14.10.2013