如何仅在未定义全局变量时才初始化全局变量



我有一个全局字典变量,它将用于多次调用的函数中。我无法控制何时调用函数,也无法控制我正在编写的函数之外的范围。 只有在变量未初始化的情况下,我才需要初始化变量。 初始化后,我将向其添加值。

global dict
if dict is None:
    dict = {}
dict[lldb.thread.GetThreadID()] = dict[lldb.thread.GetThreadID()] + 1

不幸的是,我得到了

NameError: global name 'dict' is not defined

我知道我应该定义变量,但由于这段代码被多次调用,只要说dict = {}我每次调用代码时都会重新定义变量,除非我可以以某种方式检查它是否未定义,然后才定义它。

捕获错误:

try:
    _ = myDict
except NameError:
    global myDict
    myDict = {}

重要提示:

不要使用 dict 或任何其他内置类型作为变量名。

一种更惯用的方法是提前将名称设置为哨兵值,然后检查该值:

_my_dict = None
...
def increment_thing():
    global _my_dict
    if _my_dict is None:
        _my_dict = {}
    thread_id = lldb.thread.GetThreadID()
    _my_dict[thread_id] = _my_dict.get(thread_id, 0) + 1

请注意,我对lldb一无所知 - 但如果它使用 python 线程,您可能最好使用 threading.local

import threading
# Thread local storage
_tls = threading.local()
def increment_thing():
    counter = getattr(_tls, 'counter', 0)
    _tls.counter = counter + 1

相关内容

  • 没有找到相关文章

最新更新