为什么我的函数在添加导入时变成了一个模块?
Why does my function turn into a module when adding imports?
我有一个结构如下的项目:
Root/
|-- project/
| |-- test/
| | |-- __init__.py
| | |-- test_main.py
| |
| |-- __init__.py
| |
| |-- scripts/
| | |-- __init__.py
| | |-- some_script.py
| |
| |-- settings/
| | |-- __init__.py
| | |-- load_settings.py
| | |-- MAPS.py
| | |-- TRSFM.py
|
|-- setup.py
|-- README
在我的设置文件夹中,我有几个包含我存储数据的字典的 py 文件 -> load_settings.py 用于检索这些文件。
我的问题是,当我尝试在 load_settings.py 中导入不止一个时,load_settings.py 从一个函数变成了一个模块,它似乎没有任何函数检查
__init__.py(在设置文件夹中)
from .load_settings import load_settings
加载时settings.py定义如下:
load_settings.py
from .settings import MAPS
def load_settings(setting):
return MAPS[setting]
和 some_script.py 使用以下代码:
some_script.py
from project.settings import load_settings
help(load_settings)
下面的命令是运行:
python -m project.scripts.some_script
我得到以下输出:
Help on function load_settings in module project.settings.load_settings:
load_settings(setting)
但是,如果我更改 load_settings.py 以包括其他导入:
load_settings.py
from .settings import MAPS
from .settings import TRSFM
def load_settings(setting):
return MAPS[setting]
def load_transforms(trsfm):
return TRSFM[trsfm]
和 运行 与上面相同的命令,我得到以下输出:
Help on module project.settings.load_settings in nec.settings:
NAME
project.settings.load_settings
DATA
MAPS = {'A': {'a': 'b', 'c': 'd ...
FILE
/home/user/ws/Root/project/settings/load_settings.py
首先我认为问题出在函数和文件 (load_settings) 具有相同的名称,但更改它们没有任何区别。
我无法弄清楚为什么会发生这种情况,因为我希望能够导入和调用 some_script.py 中的函数,例如:
from project.settings import load_settings
a_dict = load_settings('A')
在将第二个导入添加到加载设置之前有效,但是当存在第二个导入时,它会出现以下错误:
TypeError: 'module' object is not callable
这很清楚,因为我试图调用的对象不再是一个函数,并且试图访问模块内的任何函数,例如
from project.settings import load_settings as ls
a_dict = ls.load_settings('A')
returns出现以下错误:
AttributeError: module 'project.settings.load_settings' has no attribute 'load_settings'
帮助功能再次说明了这一点 - 因为在模块内部看不到任何功能。
任何帮助将不胜感激。
init.py 文件中的相关导入和重叠的导入名称之间的混合似乎导致了这个问题 -一旦所有导入都从 中清除init.py 文件和相对导入更改为绝对的问题得到解决
我有一个结构如下的项目:
Root/
|-- project/
| |-- test/
| | |-- __init__.py
| | |-- test_main.py
| |
| |-- __init__.py
| |
| |-- scripts/
| | |-- __init__.py
| | |-- some_script.py
| |
| |-- settings/
| | |-- __init__.py
| | |-- load_settings.py
| | |-- MAPS.py
| | |-- TRSFM.py
|
|-- setup.py
|-- README
在我的设置文件夹中,我有几个包含我存储数据的字典的 py 文件 -> load_settings.py 用于检索这些文件。
我的问题是,当我尝试在 load_settings.py 中导入不止一个时,load_settings.py 从一个函数变成了一个模块,它似乎没有任何函数检查
__init__.py(在设置文件夹中)
from .load_settings import load_settings
加载时settings.py定义如下:
load_settings.py
from .settings import MAPS
def load_settings(setting):
return MAPS[setting]
和 some_script.py 使用以下代码:
some_script.py
from project.settings import load_settings
help(load_settings)
下面的命令是运行:
python -m project.scripts.some_script
我得到以下输出:
Help on function load_settings in module project.settings.load_settings:
load_settings(setting)
但是,如果我更改 load_settings.py 以包括其他导入:
load_settings.py
from .settings import MAPS
from .settings import TRSFM
def load_settings(setting):
return MAPS[setting]
def load_transforms(trsfm):
return TRSFM[trsfm]
和 运行 与上面相同的命令,我得到以下输出:
Help on module project.settings.load_settings in nec.settings:
NAME
project.settings.load_settings
DATA
MAPS = {'A': {'a': 'b', 'c': 'd ...
FILE
/home/user/ws/Root/project/settings/load_settings.py
首先我认为问题出在函数和文件 (load_settings) 具有相同的名称,但更改它们没有任何区别。 我无法弄清楚为什么会发生这种情况,因为我希望能够导入和调用 some_script.py 中的函数,例如:
from project.settings import load_settings
a_dict = load_settings('A')
在将第二个导入添加到加载设置之前有效,但是当存在第二个导入时,它会出现以下错误:
TypeError: 'module' object is not callable
这很清楚,因为我试图调用的对象不再是一个函数,并且试图访问模块内的任何函数,例如
from project.settings import load_settings as ls
a_dict = ls.load_settings('A')
returns出现以下错误:
AttributeError: module 'project.settings.load_settings' has no attribute 'load_settings'
帮助功能再次说明了这一点 - 因为在模块内部看不到任何功能。
任何帮助将不胜感激。
init.py 文件中的相关导入和重叠的导入名称之间的混合似乎导致了这个问题 -一旦所有导入都从 中清除init.py 文件和相对导入更改为绝对的问题得到解决