跨模块的访问动态变量



tl; dr:

  • 一个单独的过程在可用数据时调用函数,并提供该数据作为调用函数的输入

  • 在函数I处理数据中,希望使其结果全球可用(即,全球可用的变量动态地更改其值(

  • 什么是在模块中实现这一目标的干净方法,当在模块中,该作业将通过全局变量很好地执行?

背景

我使用的是可以通过python api

提供人类数据的眼影设备(TOBII 4C(

典型的流将是:

  1. 初始化eyetracker对象,指向眼影设备
  2. 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个模块:

  1. eyetracker.py我定义回调功能和其他眼影功能
  2. 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

相关内容

  • 没有找到相关文章

最新更新