我有一段python代码,它被设置为按时间表运行。(我认为我的问题是一样的,如果它是在一个循环。)
假设在最基本的形式中,代码片段看起来像这样:A = 1
B = 2
renameMe = A + B
假设调度程序每5分钟运行一次相同的代码片段。变量A &每次代码运行时,B都不同,但操作renameMe = A + B
总是相同的。
A &B是从每5分钟更新一次的数据框中抓取出来的,所以我事先不知道它们是什么,但如果我需要事先处理它们而不是将它们分配给a &B马上,我可以。
我最近发现,为了其他事情的工作,我需要能够重命名变量renameMe
每次代码片段运行。换句话说,我希望变量的名称在代码片段第一次运行时为renameMe1
,然后在5分钟后运行时为renameMe2
,依此类推。
变量的名称以何种方式改变(int, strs,等等)并不重要,只要我能够找到新的变量名称是什么,并在其他地方使用它。
DoNOT使用变量变量名,你会有问题,使用容器:
列表:
# first time
container = []
# each loop/run
container.append(A+B)
## last value
container[-1]
字典:
# first time
container = {}
# each loop/run
container['new_id'] = A+B
# access arbitrary value
container['my_previous_id']
如果您需要持久性,请使用平面文件或数据库。
我认为使用一个类使setattr
可以使用是合适的:
class newVal:
def __init__(self):
self.n = 1
def addVal(self, a, b):
setattr(self, f”val{self.n}”, a+b)
self.n += 1
Values = newVal()
Values.addVal(a, b)
Values.val1
现在被赋值为
我同意Mozway
所说的变量名称可能会导致问题,但这也是您可以严格的事情。管理。
globals()
以2元组集合的形式存储所有变量的名称和值,如下所示:
dict_items([('__name__', '__main__'), ..., ('thisName', 'renaMe1'), ('renaMe18', 10)])
如果你遵循a natural law of equal births and deaths
,你将避免人口过剩。
我建议你写这段代码(里面有注释):
basename = 'renaMe'
def varUpdate():
# Get previous variable name
thisName = [i for i, j in globals().items() if i[:len(basename)] == basename][0]
# Define the new variable name
newName = basename + '%d'%sum([int(thisName[len(basename):]), 1])
# Register the new variable name
globals()[newName] = globals()[thisName]
# Delete previous variable name from global
del globals()[thisName]
def process(i):
# Isolate from process content for readibility
varUpdate()
# PROCESS BELOW
# ....
newVar = [i for i, j in globals().items() if i[:len(basename)] == basename][0]
print(newVar, " : ", globals()[newVar])
# With this for` loop we simulate 4 entries in process
for i in range(4):
### we enter in the process
process(i)
在shell中测试
首先重新启动您的shell,让我们假设我们在开始有renaMe12 = 12
:
>>> renaMe12 = 12
>>> Proposed Script ...
结果
变量的名称在每次迭代中递增。
renaMe13 : 12
renaMe14 : 12
renaMe15 : 12
renaMe16 : 12
如果你现在检查shell,你可以看到在迭代结束时,renaMe12
到renaMe15
不再存在。
只存在值为12的变量renaMe16
。
>>> renaMe16
12
>>>> renaMe15
Retraçage (dernier appel le plus récent) :
Shell Python, prompt 4, line 1
builtins.NameError: name 'renaMe15' is not defined
结论
这个讨论只是为了实验,但如果我是你,我会尽我所能避免这种代码复杂化,除非有必要。我同意Mozway
,当你认为你应该避免疼痛头痛…