gpt4 book ai didi

python - 支持一个python包的两个版本,无需客户端更改代码

转载 作者:行者123 更新时间:2023-12-04 11:35:13 25 4
gpt4 key购买 nike

我试图在不影响客户端代码的情况下支持多个版本的 python 包。
考虑以下 repo :

.
|-- client_code.py
`-- lib
|-- __init__.py
`-- foo.py
client_code.py :
from lib.foo import f
...
f()
我要离开 client_code.py不变。我首先尝试做这样的事情:
lib
|-- __init__.py
|-- v1
| |-- __init__.py
| `-- foo.py
`-- v2
|-- __init__.py
`-- foo.py
lib/__init__.py :
import os

if os.environ.get("USE_V2", "0") == "0": # Or some other runtime check
from .v1 import foo
else:
from .v2 import foo
但是客户端代码失败并出现以下错误:
Traceback (most recent call last):
File "client_code.py", line 1, in <module>
from lib.foo import f
ImportError: No module named foo
我知道以下选项可行,但它们需要客户更改代码:
if os.environ.get("USE_V2", "0") == "0":
from lib.v1.foo import f
else:
from lib.v2.foo import f

f()
if os.environ.get("USE_V2", "0") == "0":
import lib.v1.foo as foo
else:
import lib.v2.foo as foo

foo.f()
这样的事情可能吗?
该问题的更一般版本在这里: Support two versions of a python package without clients needing to change code

最佳答案

我不确定它是最优雅的,但这似乎有效。

├── client.py
└── lib
├── __init__.py
├── foo.py
├── v1
│   └── foo.py
└── v2
└── foo.py
文件
import os
if os.environ.get("USE_V2", "0") == "0":
from lib.v1.foo import *
else:
from lib.v2.foo import *
v1/foo.py
def f():
print("I'm v1.f")
v2/foo.py
def f():
print("I'm v2.f")
客户端.py
from lib.foo import f

f()
运行输出:
$ env | grep USE_V2
USE_V2=1
$ python client.py
I'm v2.f
$ unset USE_V2
$ python client.py
I'm v1.f
有实际 foo.py import *看起来很糟糕,但这只是懒惰的方法。鉴于 v1 和 v2 的内容有些不同,您可以让 foo.py 调整导入以在两种情况下呈现统一的 API。或者你可以说准备一个 functools.partial V2 中不再存在的 V1 函数的版本。 __init__.py是空的,甚至不需要在 Python 3 下存在。

关于python - 支持一个python包的两个版本,无需客户端更改代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67994542/

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