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()
动态创建新符号名称的习惯用法不起作用。
我正在创建动态变量:
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()
动态创建新符号名称的习惯用法不起作用。