gpt4 book ai didi

python - 如何在 Python 包中安全地 "fake"模块

转载 作者:太空狗 更新时间:2023-10-30 03:00:38 24 4
gpt4 key购买 nike

目前我在master中的目录结构如下git分支机构:

/dir1
__init__.py
module.py

这将更改为(在我的分支中):

/dir1
__init__.py
/dir2
module1.py # With 70% of code of module.py
module2.py # With 30% of code of module.py

问题:

  1. 我知道不可能制作git跟踪两个新文件,但自 git识别重命名(并且它考虑将文件夹组织为重命名)我将能够跟踪对 module.py 的更改从主分支到我分支的module1.py ,至少对于 70% 的代码(我必须手动更新 module2.py)。那么有没有更好的方法来处理这个问题呢?

  2. 为了 API 的一致性,我希望使用旧版本我的包的人仍然使用 from dir1.module import abc (在 module.py 中没有 dir1 )这可以像描述的那样完成 here , 但这伴随着弄乱 sys 的危险路径变量,出于稳定性和安全考虑,不建议使用。有没有更好的方法可以使 API 向后兼容并仍然安全/稳定?


不过,我的情况比较复杂。对于更具代表性的示例,请考虑从:

/dir1
__init__.py
module_2.py
def add2(a, b):
return a + b
def sub2(a, b):
return a - b
module_3.py
def add3(a, b, c):
return a + b + c

到:

/dir1
__init__.py
/dir2
__init__.py
module_add.py
# ... Constitutes 70% of code from `dir1/module_2.py`
def add2(a, b):
return a + b
# A few more additional lines added from `dir1/module_3.py`
def add3(a, b, c):
return a + b + c
module_sub.py
# Constitutes the 30% from /dir1/module2.py
def sub2(a, b):
return a - b

所以本质上我是在拆分 dir1/module_2.py 的不同功能和 dir1/module_3.py并将它们重新组合成单​​独的 module_add.pymodule_sub.py并将其放在 /dir1/dir2

但是,获得版本 2 软件包的版本 1 用户仍然可以:

from module_2 import add2, sub2
from module_3 import add3

我不能做的事情:

  • module_2.pymodule_3.pydir1 (我需要 git 关联和跟踪 master 分支的 dir1/module_2.py 到我分支的 dir1/dir2/module_2.py);
  • 改变或搞乱sys.path以任何降低稳定性/安全性的方式;或
  • 重命名 dir2例如module_2 .

最佳答案

注意以下设置:

/dir1
__init__.py
from module import abc
module.py
abc = None

从外部(几乎)无法区分:

/dir1
__init__.py
from module import abc
/module
__init__.py
from module1 import abc
module1.py # this is the moved and renamed module.py, with git history
abc = None
module2.py # this is the 30% you've factored out
# whatever's in here

外部 module.py/module,旧的导入from module import abc(和from dir1.module import abc 等)继续工作。


对于更复杂的示例,您仍然可以从以下位置切换:

/dir1
__init__.py
from module_2 import add2, sub2
from module_3 import add3
module_2.py
module_3.py

到:

/dir1
__init__.py
from dir2.module_add import add2, add3
from dir2.module_sub import sub2
/dir2
__init__.py
module_add.py # module_2.py moved & renamed
module_sub.py # module_3.py moved & renamed or new file
/module_2
__init__.py
from ..dir2.module_add import add2
from ..dir2.module_sub import sub2
/module_3
__init__.py
from ..dir2.module_add import add3

旧代码(例如 from dir1.module_2 import add2)仍然可以正常工作,但用户现在可以开始访问新位置(例如 from dir1.dir2.module_add import add2,添加 3)。


您还可以添加例如:

import warnings
warnings.warn("deprecated", DeprecationWarning)

/dir1/module_2/dir1/module_3 中的 __init__.py 文件向用户提供警告,这些导入现在是出去的路上。例如:

>>> import warnings
>>> warnings.simplefilter('always')
>>> from dir1.dir2.module_sub import sub2
>>> sub2(1, 2)
-1
>>> from dir1.module_3 import add3

Warning (from warnings module):
File "dir1\module_3\__init__.py", line 2
warnings.warn("deprecated", DeprecationWarning)
DeprecationWarning: deprecated
>>> add3(1, 2, 3)
6

关于python - 如何在 Python 包中安全地 "fake"模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28551841/

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