Python从父目录导入并让flake8保持快乐

Ben

这种导入效果很好,但在某些方面感觉很脏。主要是因为它使用slice *中的特定数字来获取父路径,并且使flake8 linter烦恼。

import os
import sys
sys.path.append(os.path.dirname(__file__)[:-5])
from codeHelpers import completion_message

它在一个看起来像这样的文件系统中:

parent_folder
    __init__.py
    codeHelpers.py

    child_folder
        this_file.py

child_folder实际上称为week1,因此是切片中的5)

这个问题与从父目录导入Python非常相似,但是在这种情况下,讨论的重点是从端点运行测试是否合适。就我而言,我有一系列目录,这些目录的代码使用父代中的助手。

上下文:每个目录都是一组每周的练习,所以我想让它们尽可能简单。

有没有更清洁,更pythonic的方式来执行此导入?

@cco解决了数字问题,但仍然使lint感到沮丧。

拉布里斯·克诺索斯(Labrys Knossos)

首先,由于您不确定要获取哪个皮棉错误,因此我认为这是因为您在之后有一个导入sys.path.append

最干净的方法是相对或绝对导入。

使用绝对导入:

from parent_path.codeHelpers import completion_message

使用相对导入:

from ..codeHelpers import completion_message

对于原始问题中列出的简单示例,这应该是所需要的。这很简单,它是pythonic语言,很可靠,而且可以解决皮棉问题。

您可能会发现上述情况对您不起作用,并且sys.path仍然需要进行操作。缺点是您的IDE可能无法解析从新路径到模块的导入,从而导致诸如自动代码完成无法正常工作以及将导入标记为错误的问题,即使代码可以正常运行。

如果发现仍然需要使用sys.path这种类型的情况并希望避免出现皮棉错误,请创建一个新模块并在其中进行sys.path操作。然后,确保在导入所有需要修改的模块之前先导入新模块sys.path

例如:

local_imports.py

"""Add a path to sys.path for imports."""

import os
import sys

# Get the current directory
current_path = os.path.dirname(__file__)

# Get the parent directory
parent_path = os.path.dirname(current_path)

# Add the parent directory to sys.path
sys.path.append(parent_path)

然后在目标文件中:

import local_imports  # now using modified sys.path
from codeHelpers import completion_message

这样做的缺点是它要求您包含local_imports.py每个child_folder文件,并且如果文件夹结构发生更改,则必须修改每个local_imports文件。

该模式真正有用的地方是当您需要在包中包括外部库(例如在libs文件夹中)而无需用户自己安装库时。

如果将这种模式用于libs文件夹,则可能需要确保所包含的库比已安装的库更受青睐。

为此,请更改

sys.path.append(custom_path)

sys.path.insert(1, custom_path)

这将使您的自定义路径成为python解释器将检查的第二个位置(第一个仍然''是本地目录)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章