在Python中,前导下划线 _
是一种约定俗成的方式来表示一个变量或函数是“受保护的”(protected),意味着它不应该被外部代码直接访问。这是一种非强制性的命名约定,用来提醒其他开发者这个属性或方法有特定的用途,或者是为了内部实现而设计的。
在 _cache
的情况下,使用下划线是因为它是一个模块级别的私有变量,不应该被模块外部的代码直接访问。它被用作模块内部的缓存存储,如果外部代码直接访问或修改这个变量,可能会破坏缓存的一致性或导致不可预见的错误。
以下是一些使用下划线命名的约定:
- 单下划线
_
:表示该变量或函数是受保护的,不应该被外部直接访问,但Python解释器并不会强制这个规则。 - 双下划线
__
:表示名称改写(name mangling),Python解释器会将这样的名称改写为_classname__attributename
,使得它不能被外部直接访问,这是为了防止子类中的同名属性与父类中的属性冲突。 - 单下划线后跟下划线
_
:例如__end
,在Python中,这种命名方式通常用在魔术方法(magic methods)或特殊方法上,如__init__
或__str__
。
使用下划线并不是强制性的,它更多的是作为一种文档形式,帮助其他开发者理解代码的意图和结构。
在方法2中,_cache
是一个字典,用作手动实现的缓存机制。这个字典存储了函数 foo
的参数和对应的返回值。当 foo
被调用时,代码会首先检查 _cache
中是否存在相同的参数,如果存在,就直接返回缓存的值,而不需要重新执行函数体。如果不存在,函数会被执行,其返回值会被存储到 _cache
中,供下次调用时使用。
下面是使用 _cache
字典实现手动缓存的示例代码:
# 脚本1.py
def foo():
print("Function foo is called")
return "foo"
_cache = {}
def cached_foo(*args):
if args in _cache:
print("Returning cached value")
return _cache[args]
else:
result = foo(*args)
_cache[args] = result
return result
# 脚本2.py
from 脚本1 import cached_foo
cached_foo() # 第一次调用,会执行函数体并缓存结果
cached_foo() # 第二次调用,将使用缓存的结果
在这个示例中,cached_foo
函数封装了 foo
函数,并添加了检查和更新 _cache
的逻辑。注意,这里使用了 *args
来接受任意数量和类型的参数,使得缓存机制可以适用于接受不同参数的函数调用。
手动实现缓存的好处是可以更灵活地控制缓存的行为,例如设置缓存的大小、过期时间等。但是,这也意味着你需要自己处理缓存的逻辑,可能会比使用现成的 lru_cache
装饰器更复杂一些。