Python return 无限循环中从一个函数到另一个函数的值

Python return values from one function to another in infinite loop

问题:

def tradingview(): 是无限循环,应该 return 两个数字

def tradingview():
        while True:           
                with open(filepath, 'r') as f:
                        count_var_short = f.read().count('Exit Short    Open')
                        print('Current shorts open:',count_var_short)                            
                with open(filepath, 'r') as f:
                        count_var_long = f.read().count('Exit Long    Open')
                        print('Current longs open:',count_var_long)                           
        return (count_var_short,count_var_long)


def target_balance(count_var_short,count_var_long):
        current_target = cur_price_VWAP['vwap'] * freebalance['BTC']['free']
        print ('current_target long',current_target * count_var_short)
        print ('current_target short',current_target * count_var_long)

if __name__ == '__main__':
        Thread(target = tradingview).start()
        Thread(target = target_balance(count_var_short,count_var_long)).start()

此代码给出错误

Thread(target = target_balance(count_var_short,count_var_long)).start()
NameError: name 'count_var_short' is not defined

============================================= ==

我要def tradingview():return两个号码

count_var_shortcount_var_long

并在函数中使用它们

def target_balance(count_var_short,count_var_long):

我知道我应该阅读 return 的工作原理,但如果有人帮助我编写我自己的代码,我将非常感激,因为它对我来说更容易理解。

您想要创建一个生成器,而不是具有单个 return 值的函数,它是一个表达式,然后恢复执行。

您可以将 tradingview 重写为无限生成器:

def tradingview():
    while True:
        with open(filepath, 'r') as f:
            count_var_short = f.read().count('Exit Short    Open')
            print('Current shorts open:',count_var_short)                            
        with open(filepath, 'r') as f:
            count_var_long = f.read().count('Exit Long    Open')
            print('Current longs open:',count_var_long)                           
        yield count_var_short, count_var_long

yield 表达式 循环内 "return" 恢复执行前你想要的值。它还会将 tradingview 从常规函数转换为生成器函数,在调用时 return 生成器。

现在您可以重写调用 target_balance 的代码以使用生成器:

if __name__ == '__main__':
    for count_var_short, count_var_long in tradingview():
        target_balance(count_var_short,count_var_long)

不需要奇怪的线程行为:Python 已经提供了您需要的生成器行为。我建议您仔细阅读它们(以及一般的 yield 关键字)。