我正在編寫一段可重複使用的代碼來導入我需要的地方,但它需要一些關於導入模塊的信息。我有一個解決方法,可以做我想做的事,但它有點難看。有沒有更好的辦法?Python:從導入的模塊中獲取導入模塊的詳細信息
這是我正在做的簡化版本。
我想要什麼:導入一個方法並使用它,但看看mod2中的f。它需要來自導入模塊的一些信息。
MOD1:
from mod2 import f
f(...)
MOD2:
from things_i_want import parent_module, importing_module
def f(*args, **kwargs):
from importing_module.parent_module import models
# ... do some stuff with it, including populating v with a string
v = 'some_string'
m = getattr(importing_module, v, None)
if callable(m)
return m(*args, **kwargs)
我的醜的解決方法:
MOD1:
from mod2 import f as _f
def f(*a, **k):return _f(__name__, globals(), *a, **k)
f(...)
模2:
def f(module_name, globs, *args, **kwargs):
# find parent modules path
parent_module_path = module_name.split('.')[0:-1]
# find models modules path
models_path = parent_module_path + ['models',]
# import it
models = __import__('.'.join(models_path), {}, {}, [''])
# ... do some stuff with it, including populating v with a string
v = 'some_string'
if v in globs:
return globs[v](*args, **kwargs)
如果你給我們一個關於*爲什麼*你想要這個的小背景可能會有幫助,因爲這是一個非常不尋常的要求。 – 2010-01-08 10:11:33
這是充滿危險的。導入的模塊不應該通過神奇的方式「意識到」它們的上下文。這是一場測試噩夢。你想跟隨所謂的「依賴注入」,你明確告訴導入的模塊它需要知道什麼。上下文沒有神奇的「發現」。 – 2010-01-08 11:29:04
給出一些上下文: 這是在Django的webapp中。我在我的urlconf中調用了一個方法,它將RESTful URL全部映射到模型視圖中的方法。此方法查看request.method,然後檢查foo_delete等視圖中是否存在方法並調用它,或者爲該url和請求方法運行默認操作。 – Jake 2010-01-11 01:07:42