gpt4 book ai didi

python - 跨模块访问动态变化的变量

转载 作者:行者123 更新时间:2023-12-01 07:50:48 25 4
gpt4 key购买 nike

TL;博士:

  • 每当数据可用时,单独的进程就会调用函数,并将该数据作为被调用函数的输入提供

  • 在函数中,我处理数据,并希望使其结果全局可用(即全局可用变量动态更改其值)

  • 什么是跨模块实现此目的的干净方法,在模块内时,可以通过全局变量很好地执行此工作?

背景

我使用眼球追踪设备 (Tobii 4C),它可以通过 Python API 提供人类的视线数据。

典型的流程是:

  1. 初始化一个eyetracker对象,指向眼球跟踪设备
  2. “订阅”眼球追踪器对象到实际数​​据:eyetracker.subscribe_to(DATA, callback)

回调是一个函数句柄,每次眼动追踪设备有新数据可用时都会调用该函数句柄。通常它会被用来保存数据,例如:

# `gaze_data` is what gets returned from the eyetracking device that we subscribed to
def my_callback(gaze_data):
# fname is defined globally in this case
with open(fname, 'a') as f:
f.write(gaze_data)

数据记录将在“后台”运行,直到我们无法eyetracker.unsubscribe()

但是,要使用“实时”注视数据,必须将 gaze_data 设为全局变量,例如

def my_callback(gaze_data):
global gaze
gaze = gaze_data['gaze_point']

...现在我们可以在脚本中使用 gaze,只要回调函数运行(以眼动追踪设备的采样率发生),它就会不断“更新”

问题

我有一个更大的项目,我在其中组织了 2 个模块:

  1. eyetracker.py 我在其中定义回调函数和其他眼球跟踪函数
  2. test_eyetracker.py 我从 eyetracker.py 导入函数并测试它们

但是,当我将函数从 eyetracker.py 导入 test_eyetracker.py 时,全局变量 gaze 并未更新。

经过大量搜索,我意识到这是因为global variables are not cross-module 。因此,当在 test_eyetracker.py 中时,应更新 gaze,此更改在 test_eyetracker.py 范围内不可用,因此,调用就像 assert Gaze == 'value_i_know_it_should_be' 评估为 False。

当前解决方案

我当前的解决方案是在脚本中定义眼球追踪函数,我也在脚本中使用它们。然而,这感觉不太干净,特别是因为我想在其他几个模块(不仅仅是测试模块)中使用眼球追踪功能=代码重复。

有更好的方法来组织这个吗?

我遇到过这个post这显示了内置函数如何成为唯一真正的跨模块全局变量...但不鼓励使用它们进行允许跨模块全局变量的调整。

最佳答案

解决此问题的方法是使用全局字典等。我将向您展示基于 linked 的代码片段演示这个想法的问题:

文件1.py:

global_dict = {'x': 5}
x = 5 # for comparison

文件2.py:

from file1 import *

def update_x():
global x
global global_dict
x += 1
global_dict['x'] += 1

main.py:

from file2 import *

update_x()
print(x) # 5
print(global_dict['x']) # 6

关于python - 跨模块访问动态变化的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56225402/

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