gpt4 book ai didi

Python:用类变量替换全局变量是不是 'proper'

转载 作者:行者123 更新时间:2023-12-01 05:00:21 31 4
gpt4 key购买 nike

请善待我,我是 Python 初学者:-)

现在,我发现编写 Python 程序的“最佳实践”是将主代码包装在“main”函数中,并执行 if "__main__"== __name__: 测试调用“main”函数。

这当然导致需要在“main”函数中使用一系列global语句来访问全局变量。

我想知道将全局变量收集到自定义类中是否更合适(或者“Pythonic”,如果你愿意的话),例如_v,并使用_v引用变量. 前缀代替?

此外,作为一个必然的问题,这会对性能或异常处理产生负面影响吗?

<小时/>

编辑:以下是程序的一般结构:

paramset = {
0: { ...dict of params... }
1: { ...dict of params... }
2: { ...dict of params... }
}

selector = 0
reset_requested = False
selector_change = False

def sighup_handler(signal,frame):
global reset_requested
logger.info('Caught SIGHUP, resetting to set #{0}'.format(new_selector))
reset_requested = True
selector = 0

def sigusr1_handler(signal,frame):
global selector
new_selector = (selector + 1) % len(paramset)
logger.info('Caught SIGHUP, changing parameters to set #{0}'.format(new_selector))
selector = new_selector
selector_change = True

signal.signal(signal.SIGHUP, sighup_handler)
signal.signal(signal.SIGUSR1, sigusr1_handler)

def main():
global reset_requested
global selector
global selector_change
keep_running = True
while keep_running
logger.info('Processing selector {0}'.format(selector))
for stage in [process_stage1, process_stage2, process_stage3]
err, result = stage(paramset[selector])
if err is not None:
logger.critical('Stage failure! Err {0} details: {0}'.format(err, result))
raise SystemError('Err {0} details: {0}'.format(err, result))
else:
logger.info('Stage success: {0}'.format(result))
if reset_requested:
stage_cleanup()
reset_requested = False
else:
inter_stage_pause()
if selector_change:
selector_change = False
break
selector = (selector + 1) % len(paramset)

最佳答案

示例代码中缺少足够多的部分,因此很难得出任何确定的结论。

事件驱动方法

解决此类问题的通常方法是使其完全由事件驱动。就目前而言,代码主要是轮询。例如,sighup_handler 设置 reset_requested = True,并且 main 中的 while 循环处理该请求。事件驱动的方法将处理重置,这意味着直接调用 stage_cleanup:

def sighup_handler(signal,frame):
logger.info('Caught SIGHUP, resetting to set #{0}'.format(new_selector))
stage_cleanup()


具有共享变量的类

在示例代码中,所有这些 process_stages 和各个阶段循环的目的尚不清楚。这一切都可以放在事件驱动的上下文中吗?我不知道。如果它不能并且确实需要共享变量,那么您对类的建议将是一个自然的选择。这样一个类的开头可能如下所示:

class Main(object);

def __init__(self):
self.selector = 0
self.selector_change = False
signal.signal(signal.SIGHUP, self.sighup_handler)
signal.signal(signal.SIGUSR1, self.sigusr1_handler)

def sighup_handler(self, signal,frame):
logger.info('Caught SIGHUP, resetting to set #{0}'.format(new_selector))
stage_cleanup()
self.selector = 0

def sigusr1_handler(self, signal,frame):
new_selector = (selector + 1) % len(paramset)
logger.info('Caught SIGHUP, changing parameters to set #{0}'.format(new_selector))
self.selector = new_selector
self.selector_change = True

def mainloop(self):
# Do here whatever polling is actually required.

if __name__ == '__main__':
main = Main()
main.mainloop()

同样,因为我不清楚轮询循环的真正目的,所以我没有尝试在上面的类中重现其功能。

关于Python:用类变量替换全局变量是不是 'proper',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26352167/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com