引用包中的函数时不断出错(TypeError:“模块”对象不可调用)

问题描述 投票:0回答:1

我在尝试为项目执行 pytest UT 时遇到错误。

E       TypeError: 'module' object is not callable

我有以下存储库结构:

├───src
│   └───company
│       ├───acc
│       └───dp
│           └───logic
│               ├───business
│               │   ├───__init__.py 
│               │   ├───filter_customer.py
│               │   └───review_customers.py
│               └───general
│                   └───__init__.py (and some functions)
├───tests
│   └───company
│       └───dp
│           └───logic
│                └───business
├───conftest.py
└───pyproject.toml

业务包下的每个文件都包含一个与该文件同名的函数。

让我们想象一下文件

filter_customer.py

def filter_customer(i: int)
    return something

让我们想象一下文件

review_customers.py
(在 c =... 行中,运行此函数的 UT 时会引发错误):

from src.company.dp.logic.business import filter_customer
def review_customers()
    c = filter_customer(10)
    return something

UT 看起来像这样:

from src.company.dp.logic.business import review_customers
def test_review_customers()
    #something before
    t = review_customers()
    #assert

__init__.py
业务包文件如下所示:

from src.company.dp.logic.business.filter_customer import filter_customer
from src.company.dp.logic.business.review_customers import review_customers

pyproject.toml

[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"

[tool.setuptools.packages.find]
where = ["src"]

[tool.pytest.ini_options]
addopts = [
]
testpaths = ["tests/company/dp/logic/business"]
python_files = "test_*.py"
python_functions = "test_*"
pythonpath = "src"
norecursedirs = "*"

在这种情况下如何正确组织包/模块?

目标是每个文件和包(例如 Business 和 General)拥有一个函数,以涵盖从模块的导入。

我尝试过多个版本。

当我使用从模块/文件直接导入时,它可以工作。当我像一般一样从不同的包调用函数时它也有效。

# This works:
from src.company.dp.logic.business.filter_customer import filter_customer

# With this I have error, even though IDE resolve it correctly:
from src.company.dp.logic.business import filter_customer


# This works:
from src.company.dp.logic.general import some_function

def review_customers()
    c = filter_customer(10)
    return something
python import pytest python-module python-packaging
1个回答
0
投票

filter_customer
是一个模块,还包含一个名为
filter_customer
的函数。您正在呼叫
filter_customer
,而不是
filter_customer.filter_customer

(这对我来说意味着您正在为每个函数定义一个单独的模块;不要这样做。)

© www.soinside.com 2019 - 2024. All rights reserved.