gpt4 book ai didi

Python:如何跨模块使用变量

转载 作者:太空狗 更新时间:2023-10-30 00:07:26 25 4
gpt4 key购买 nike

我正在尝试弄清楚如何跨模块使用变量和设置。

当我认为将程序的独立功能保留在单独的模块中是明智之举时,我是对的吗?

我有一个名为 main.py 的主程序模块,其中包含:

# Sets GPIO's to HIGH = Relays OFF
try:
import RPi.GPIO as GPIO
except RuntimeError:
Print("Error importing RPi.GPIO!!")

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
# GPIO16 is relay1
GPIO.setup(16, GPIO.OUT, initial=GPIO.HIGH)
# GPIO11 is relay2
GPIO.setup(11, GPIO.OUT, initial=GPIO.HIGH)

然后我导入一个模块(在那个模块中我有一个名为Relay的函数)并尝试将函数与 module1.Relay(1,1)

一起使用

但是 module1 中的函数需要 main.py 中的 GPIO 才能工作。我该怎么做?我真的不想要module1中的GPIO设置部分,我不想每次运行module1.Relay(1 ,1) 调用..

跨模块工作的最佳实践是什么? (我正在为我家的供暖系统制作一个 Controller 。)

最佳答案

在不同的模块中保持应用程序的独立功能是正确的 - 将代码分组到逻辑相关的单元中绝对有意义。但这并不总是微不足道的,并且迫使您清楚地思考这取决于什么,以及关注点的分离。您在这里遇到的称为循环导入

有两种明显的方法可以解决循环导入:

  • 提取由多个模块共享的东西,并将其放在单独的模块中。在您的情况下,这是 GPIO 包括它的初始化。
  • 不要导入在每个模块中共享的东西,而是导入一次并将其作为参数传递给其他需要它的东西。

将其提取到自己的模块中

GPIO 初始化提取到它自己的模块中可能如下所示:

主.py

from gpio import GPIO
import module1

print "main: %s" % GPIO.__name__
# Do stuff wth GPIO

module1.Relay()

gpio.py

# Sets GPIO's to HIGH = Relays OFF
try:
import RPi.GPIO as GPIO
except RuntimeError:
print("Error importing RPi.GPIO!!")

print "Setting up GPIO"
GPIO.state = 'initialized'
print "Done setting up"

module1.py

from gpio import GPIO

def Relay():
print "Relay: %s" % GPIO.__name__
# Do stuff with GPIO

运行main.py时的输出:

Setting up GPIO
Done setting up
main: RPi.GPIO
Relay: RPi.GPIO

如您所见,gpio.py 模块全局范围内的 GPIO 初始化只运行一次,第一次时模块被导入任何地方。

作为参数传递

另一个选项,导入一次 GPIO 并作为参数传递可能如下所示:

主.py

# Sets GPIO's to HIGH = Relays OFF
try:
import RPi.GPIO as GPIO
except RuntimeError:
print("Error importing RPi.GPIO!!")

print "Setting up GPIO"
GPIO.state = 'initialized'
print "Done setting up"

import module1

print "main: %s" % GPIO.__name__
# Do stuff wth GPIO

module1.Relay(GPIO)

module1.py

def Relay(gpio):
print "Relay: %s" % gpio.__name__
# Do stuff with GPIO

在我看来,对于您的情况,这两种方法都是有效的。我个人更喜欢在中央 gpio.py 模块中进行初始化,然后从那里导入,但这只是个人喜好问题。

关于Python:如何跨模块使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19747052/

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