gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:44:41 29 4
gpt4 key购买 nike

此导入工作正常,但在某些方面感觉很脏。主要是它使用 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 import from parent directory极其相似,但在那种情况下,讨论的重点是从终点开始运行测试是否好。 In my case ,我有一系列目录,这些目录的代码使用父级中的助手。

上下文:每个目录都是一组每周练习,因此我希望它们尽可能简单。

是否有更简洁、更 pythonic 的方式来执行此导入?

@cco 解决了数字问题,但它仍然让 linter 感到不安。

最佳答案

首先,由于您没有具体说明收到的 lint 错误,我假设这是因为您在 sys.path.append 之后进行了导入。

最简洁的方法是使用相对或绝对导入。

使用绝对导入:

from parent_path.codeHelpers import completion_message

使用相对导入:

from ..codeHelpers import completion_message

对于原始问题中列出的简单示例,这应该是所需要的。它简单、符合 Python 风格、可靠,并且修复了 lint 问题。

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

如果您发现仍然需要使用 sys.path 并希望避免这种情况下的 lint 错误,请创建一个新模块并执行 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

这样做的缺点是它要求您在每个 child_folder 中包含 local_imports.py,如果文件夹结构发生变化,您将不得不修改每个 local_imports 文件。

当您需要在包中包含外部库(例如在 libs 文件夹中)而不需要用户自己安装库时,此模式真正有用。

如果您将此模式用于 libs 文件夹,您可能需要确保包含的库优先于已安装的库。

为此,改变

sys.path.append(custom_path)

sys.path.insert(1, custom_path)

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

关于Python 从父目录导入并保持 flake8 快乐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42825138/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com