2013-10-14 56 views
2

有沒有辦法強制導入是絕對的而不是相對的?強制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'。 A print(pyjson.__file__)確認我懷疑import json as pyjson從本地包而不是從Python標準庫導入json

有沒有辦法強制導入是絕對的,所以本地目錄被忽略?

+0

爲什麼不只是用另一個名字命名呢? – aIKid

+2

因爲:A - 意味着重構很多東西。 B - 之前我曾經遇到過這個問題,現在我想要一個很好的通用解決方案。 – RickyA

+0

'foo/json.py'僅用於您的代碼,還是可能被外部代碼使用,只是假設它獲取了「真正的」json模塊?後者聽起來並不安全,前者可以簡單地通過「import myjson as json」來解決,而不是試圖「模塊化」模塊。 – chepner

回答

4

如果你的「json的」模塊是一個包內,那麼這將解決這個問題:

from __future__ import absolute_import 

隨着該__future__聲明,進口將是絕對的缺省情況下 - 也就是說,它只會尋找一個頂級模塊或文件稱爲json

如果您需要導入本地一個,你可以做import foo.json,或者你可以顯式地要求使用from . import jsonfrom .json import dumps相對進口。

(我假設你使用Python 2)。