Spyder - NameError: name 'variable' is not defined with vars(), but gobals works

Spyder - NameError: name 'variable' is not defined with vars(), but gobals works

我正在创建动态变量:

import mplfinance as mpf
import pandas as pd
from polygon import RESTClient

def main():
    with RESTClient('key') as client:
        start = "2019-02-01"
        end = "2019-02-02"
        ticker = "TVIX"
        intervals = [5,15,30,60]
        
        for i in intervals:
            print(f'downloading {i} minutes.')
            vars()[f'df{i}'] = client.stocks_equities_aggregates(ticker, str(i), "minute", start, end, unadjusted=False)
                       
        print(df5)

if __name__ == '__main__':
    main()

当 运行 我收到错误 NameError: name 'df5' is not defined

我可以调试并看到变量确实存在于 Spyder 变量资源管理器中,如下所示。

它适用于 global() 但不适用于 vars() 请问我做错了什么?

我已经使用您的代码的简化版本进行了一些测试。在网上搜索了一些之后,我不清楚你是从哪里得到的这个想法,你可以通过简单地向 locals() 字典添加一个条目来创建一个新变量。添加到 globals() 字典时它似乎确实有效:

import pprint

def main():

    pp = pprint.PrettyPrinter(indent=4)

    intervals = [5,15,30,60]

    for i in intervals:
        print(f'i = {i}')
        vars()[f'df{i}'] = i**3
        # if i == 5:
        #    print('i==5: df5=',df5)
        globals()[f'df{i}'] = i**3
        if i == 5:
            print('i==5: df5=',df5)

    print('vars()=')
    pp.pprint(vars())

    print('globals()=')
    pp.pprint(globals())

    print('df5=')
    print(df5)

if __name__ == '__main__':
    main()

如果你运行上面的代码,它就可以工作。但是,如果您 取消注释 行:

        if i == 5:
           print('i==5: df5=',df5)

你会看到即使在循环的命名空间中,也没有定义变量df5。显然,这种使用 locals() 动态创建新符号名称的习惯用法不起作用。