tl; dr:
-
一个单独的过程在可用数据时调用函数,并提供该数据作为调用函数的输入
-
在函数I处理数据中,希望使其结果全球可用(即,全球可用的变量动态地更改其值(
-
什么是在模块中实现这一目标的干净方法,当在模块中,该作业将通过全局变量很好地执行?
背景
我使用的是可以通过python api
提供人类数据的眼影设备(TOBII 4C(典型的流将是:
- 初始化
eyetracker
对象,指向眼影设备 - subscribe;目击者对象的实际数据:
eyetracker.subscribe_to(DATA, callback)
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)
然后,数据录制将在"背景"中运行,直到我们canc eyetracker.unsubscribe()
但是,要使用" Live"凝视数据,必须使gaze_data
成为全局变量,例如,
def my_callback(gaze_data):
global gaze
gaze = gaze_data['gaze_point']
...现在我们可以在脚本中使用gaze
,它可以连续地进行"更新"。每当运行回调函数(以眼影设备的采样速率发生(
问题
我有一个较大的项目,我组织了2个模块:
-
eyetracker.py
我定义回调功能和其他眼影功能 -
test_eyetracker.py
我从eyetracker.py
导入功能并对其进行测试
但是,当我将eyetracker.py
的功能导入test_eyetracker.py
时,全局变量gaze
没有被更新。
经过大量搜索,我意识到这是因为全局变量不是交叉模块。因此,当在test_eyetracker.py
中应更新gaze
时,此更改在test_eyetracker.py
的范围内不可用,因此,assert gaze == 'value_i_know_it_should_be'
之类的调用将其评估为false。
当前解决方案
我当前的解决方案是,在脚本中定义了眼影功能,我也使用它们。但是,这并不干净,尤其是因为我想在其他几个模块(不仅仅是测试模块(中使用眼影功能=代码重复。
有更好的组织方法吗?
我遇到了这篇文章,该帖子显示了 builtins
是唯一真正的跨模块的全球群体...但是不愿将其用于调整,以使我进行跨模块全局变量。
这个问题的解决方法是使用例如全局dict。我将根据链接的问题向您展示代码段,该问题演示了这个想法:
file1.py:
global_dict = {'x': 5}
x = 5 # for comparison
file2.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