从函数中访问值

时间:2017-09-29 09:12:57

标签: python python-3.x

我试图在理想情况下从函数中访问一个值而不使其全局或再次调用该函数。我也无法使用' return'因为该函数被来自不同库的类用于定期回调。

下面的函数从CSV中读取数据(定期更新),然后所有必要的变换都使用一个名为' stream'的函数。基本上只用新数据点更新数据帧。如下所示,我尝试为我尝试访问的值设置属性 - 也就是说,' y_range_start'和' y_range_end'。最后,add_periodic_callback每1000ms调用一次更新函数来更新数据帧,最后绘制它(使用Bokeh)。

但是,为了保持轴的更新,我需要访问' y_range_start / end'从函数内部更新位于“更新”之外的数字。功能

将其作为属性访问并不起作用(上面提到的方法)因为我需要首先调用函数,即update()\ n update.y_range_start - 这是一个问题,因为我不想调用update()函数,它将再次运行它上面的其他行。我也不能使用返回值,因为更新函数专门设计用于add_periodic_callback。

我不想使用全局变量......

我还有其他选择吗?

提前致谢!

def update():
    MAU_ios = pd.read_csv('myapp/data/pplus_ios_data.csv')
    MAU_ios['Date'] = pd.to_datetime(MAU_ios['Date'])
    MAU_ios['Vol'] = MAU_ios.Vol.astype(int)

    new_MAU_ios = {'Date':MAU_ios['Date'], 'Vol':MAU_ios['Vol']}

    source_ios.stream(new_MAU_ios)

    update.y_range_start = MAU_ios['Date'].min()
    update.y_range_end = MAU_ios['Date'].max()

curdoc().add_periodic_callback(update, 1000)

1 个答案:

答案 0 :(得分:1)

你可以将它包装在一个类中(这个代码不会开箱即用,但你可以用它作为起点):

class MyFancyWrapper:
    def __init__(self, source_ios):
        self.source_ios = source_ios
        # And other stuff you might need, e.g. for `update_y_axes`

    def update(self):
        MAU_ios = pd.read_csv('myapp/data/pplus_ios_data.csv')
        MAU_ios['Date'] = pd.to_datetime(MAU_ios['Date'])
        MAU_ios['Vol'] = MAU_ios.Vol.astype(int)

        new_MAU_ios = {'Date': MAU_ios['Date'], 'Vol': MAU_ios['Vol']}

        self.source_ios.stream(new_MAU_ios)

        self.update_y_axes(MAU_ios['Date'].min(), MAU_ios['Date'].max())

    def update_y_axes(self, start, end):
        print(start)
        print(end)


wrapper = MyFancyWrapper(source)
curdoc().add_periodic_callback(wrapper.update, 1000)