gpt4 book ai didi

Python 3 区分生产和开发配置的最佳实践

转载 作者:行者123 更新时间:2023-12-02 08:38:26 26 4
gpt4 key购买 nike

我正在开发一个嵌入式系统项目,其中我的 dev 设置与我的 prod 不同。差异包括变量和包导入。

构建 devprod 设置不同的 python3 应用程序的配置文件的最佳方法是什么?

prod:我的设备与电子系统交换消息(使用 pyserial ),并与服务器通信。

dev:我使用来自函数的虚假且固定的响应来模拟电子响应和服务器响应。即使我模拟的函数在 prod 中至关重要,但在 dev 中却较少。我可以 mock 它们,因为这个项目最重要的部分是使用和处理它们的函数。因此,有些包导入和函数调用没有意义,并且会在 dev 模式下引入错误。

每次我需要从一种切换到另一种时,我都需要更改大量代码,有时还会引入错误。我知道这确实 (💩) 不是最好的方法,我想知道什么是最佳实践

找到最接近的解决方案

Here有一个很好的解决方案,为每个环境设置不同的变量。我希望有类似的东西,但对于需要为不同环境导入不同包的项目。

我的设置

基本工作流程:

  • 每秒执行一个 task 线程
    • module_1 执行工作并调用 module_2
    • module_2 执行工作并调用 module_3
    • module_3 执行工作并发回响应

基本文件夹结构:

    • 主要
    • config.py
    • /配置
      • 产品
      • 开发
    • /mod_1
    • /mod_2
    • /mod_3
    • /replace_imports

module_1module_3 各自使用 prod 的特定包,并且必须由 dev 替换> 功能

我有什么:

# config.py
if os.environ["app"] == "dev":
import * from root.config.dev
if os.environ["app"] == "prod":
import * from root.config.prod
# config/prod.py
import _3rd_party_module_alpha
import _3rd_party_module_beta
...
obj_alpha = _3rd_party_module_alpha()
func_beta = _3rd_party_module_beta()
# config/dev.py
import * from root.replace_imports
# replace_imports.py
obj_alpha = fake_3rd_party_module_alpha()
func_beta = fake_3rd_party_module_beta()

最佳答案

您确实不应该在 X 点的开发和推送到 QA/CI,然后在 X 点进行生产之间进行代码更改。您的开发和生产代码预计会在不同的情况下有所不同当然,版本控制是关键。但转移到生产环境不需要更改代码,只需更改配置即可。

环境变量(请参阅 12 factor app 内容)可以提供帮助,但有时配置位于代码中,例如在 Django 设置文件中。

在像 Django 这样的环境中,“它指向”一个设置文件,我见过这样的东西:

base_settings.py:

common config

dev_settings.py:

#top of file
import * from base_settings


... dev specifics, including overrides of base...

编辑:我很清楚 import * 的问题。首先,这是配置的一种特殊情况,您想要导入所有内容。其次,import * 的真正问题是它破坏了当前的命名空间。该导入位于顶部,因此不会发生这种情况。撇开短绒不谈,它们可以只针对那一行被抑制,剩下的问题是你可能并不总是知道变量神奇地来自哪里,除非你查看基数。

prod_settings.py:

import * from base_settings

...production specifics, including overrides of base...

Webpack 配置文件的高级用户(这些残酷)会做同样的事情,即使用base.js,然后将其导入dev。 jsprod.js

这里的关键是在base中拥有尽可能多的内容,可能需要环境变量的帮助(注意不要过度依赖这些,没有人喜欢具有数十个环境变量的应用程序)设置)。然后 devprod 基本上都是关于键、路径、url、端口之类的东西。不过,请务必保守 secret ,因为它们自然而然地被吸引到那里,但没有必要接受版本控制。

回复。您当前的代码

appname = os.getenv("app")

if appname == "dev":

#outside of base=>dev/prod merges, at top of "in-config" namespaces,
#I would avoid `import *` here and elsewhere

import root.config.dev as config

elif appname == "prod":

import root.config.prod as config

else:
raise ValueError(f"environment variable $app should have been either `dev` or `prod`. got:{appname}:")


最后,如果您没有“它指向 Python 设置文件”机制(类似于 Django 中的机制),您可以(可能)通过存储配置模块路径(xxx.prod,xxx.dev) 放在环境变量中,然后使用动态导入。请注意,您当前的代码基本上已经做到了这一点,只是您无法尝试/添加其他设置文件。

如果您没有立即掌握它,请不要担心,也不要预先过度设计 - 需要一段时间才能找到最适合您/您的应用的内容。

关于Python 3 区分生产和开发配置的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60738406/

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