Python项目结构:“;未解析引用“;

Python项目结构:“;未解析引用“;,python,pycharm,Python,Pycharm,我的python项目结构如下: - project/ +- package/ +- db/ +- __init__.py +- mydb.py +- tests/ +- context.py +- mytest.py +- file.py 在project/package/db/_init__.py中,我将mydb声明为: from package.db import mydb 通过此声明,我可以使用file.py中的mydb函数,使用: import package.db a

我的python项目结构如下:

- project/
+- package/
 +- db/
  +- __init__.py
  +- mydb.py
+- tests/
 +- context.py
 +- mytest.py
+- file.py
project/package/db/_init__.py
中,我将mydb声明为:

from package.db import mydb
通过此声明,我可以使用
file.py
中的
mydb
函数,使用:

import package.db as db

db.mydb.myfunction()
但是我也希望在
project/tests
目录中使用这个函数。因此,我添加了一个
project/tests/context.py
文件,其中包含:

import os
import sys

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

import package.db as db
mytest.py
中:

from context import db

db.mydb.myfunction()

它工作得很好

但是PyChar说:

  • import package.db as db
    (在context.py中)是未使用的导入语句
  • 来自上下文导入数据库的
    (在mytest.py中)包含未解析的(上下文)引用
有没有办法改进这个项目结构,以消除这些警告和错误

谢谢

  • 您的
    测试
    文件夹中没有
    \uuuu init\uuuuu.py
    文件;这意味着它不是python包。-如果你想让他们这么做

  • 您没有正确使用导入语句;另外,您没有在
    context.py
    文件中使用导入,因此为了修复它,您需要删除该行

  • 我建议阅读关于包装的书籍;这将使您能够更深入地了解应该在
    \uuuu init\uuuuuu.py
    文件中放入哪些内容

  • \uuuu init\uuuuu.py
    文件是Python将目录视为包含包所必需的;这样做是为了防止具有公共名称(如字符串)的目录无意中隐藏稍后在模块搜索路径上出现的有效模块。在最简单的情况下,init.py可以只是一个空文件,但它也可以为包执行初始化代码或设置
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu变量,后面将介绍

    我将使用的结构:

    - package_name
       - db
         - __init__.py
         - my_db.py
       - tests
         - __init__.py
         - my_test.py
       - __init__.py
    
    您只需要添加
    my_db.py
    文件中的代码:

    def my_function():
        return 1
    
    在您的
    my_test.py
    文件中,您将拥有:

    from package.db import mydb
    
    mydb.my_function()
    

    这就是你所需要的;关于通过
    \uuuu init\uuuuuuuuy.py
    文件更改导入,如果您确实需要,请查看
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuo>。

    非常感谢您的解释,非常清楚!我用你的建议纠正了我的结构,效果很好。我是否仍然需要在db/\uuuu init\uuuuuuuuuuuupy文件(我问题中的第二个代码块)中维护导入?我个人喜欢尽可能保持我的
    \uuuuuuuuuuuuuuuupy
    文件干净;我放在那里的唯一一件事就是对导入的任何操作(使用
    \uuuu all\uuuuu
    -阅读更多关于它的信息,这很有趣…)-因此,不,我认为您不需要在
    \uuu init\uuuuu.py
    文件中维护导入换言之;您可以从您的库导入操作
    将为用户导入的内容*
    ;它是使用
    \uuuu init\uuuuuuuuuuy.py
    文件中的
    \uuuuuu all\uuuuuuuuuuuuuuuuuuuuuu>变量指定的。如果我从包外或包内启动我的函数,它会工作。但是如果我启动
    my_test.py
    ,我会得到一个
    ModuleNotFoundError:没有名为“package”的模块
    。知道为什么吗?我认为这就是使用“上下文”文件的原因好的,找到了。我需要使用
    python-m package.tests.my_test
    调用
    和no`/`以及不使用
    .py
    扩展名