簡體   English   中英

從模塊中導入具有其名稱的子模塊

[英]import a submodule with its name from a module

我有一個調用的函數prepared_db子模塊db.db_1

from spam import db

submodule_name = "db_1"
func_name = "prepare_db"
func = ...

在上面的上下文中,如何通過子模塊名稱和函數名稱獲取函數?

更新

為了回應@histrio的回答,我可以驗證他的代碼可用於os模塊。 但這在這種情況下不起作用。 創建示例:

$ mkdir -p spam/db
$ cat > spam/db/db_1.py
def prepare_db():
    print('prepare_db func')
$ touch spam/db/__init__.py
$ PYTHONPATH=$PYTHONPATH:spam

現在,您可以正常進行導入:

>>> from spam.db.db_1 import prepare_db
>>> prepare_db()
prepare_db func

但是如果您動態地執行此操作,則會收到此錯誤:

>>> getattr(getattr(db, submodule_name), func_name)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-9-1b6aa1216551> in <module>()
----> 1 getattr(getattr(db, submodule_name), func_name)

AttributeError: module 'spam.db.db_1' has no attribute 'prepared_db'

這很簡單。 您可以將模塊視為對象。

import os

submodule_name = "path"
func_name = "exists"

submodule = getattr(os, submodule_name)
function = getattr(submodule, func_name)
function('/home') # True

或[只是為了好玩,不要那樣做]

fn = reduce(getattr, ('sub1', 'sub2', 'sub3', 'fn'), module)

UPDATE

import importlib
submodule = importlib.import_module('.'+submodule_name, module.__name__)
function = getattr(submodule, func_name)

我想我已經弄清楚了,您需要將該函數添加到__init__.py文件中的__all__變量中,這樣就可以實現以下目的:

from .db_1 import prepare_db

__all__ = ['prepare_db']

之后,它應該可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM