проблема с
sentinel = object()
def f(a, b, c=sentinel):
if c is sentinel:
c = g(b)
означает, что sentinel
является глобальным / общедоступным, если этот код не является частью функции / метода. Так что кто-то еще может позвонить f(23, 42, sentinel)
. Однако, если f
является глобальным / общедоступным, вы можете использовать закрытие, чтобы сделать sentinel
локальным / частным, чтобы вызывающий не мог его использовать:
def f():
sentinel = object()
def tmp(a, b, c=sentinel):
if c is sentinel:
c = g(b)
return tmp
f = f()
Если вы обеспокоены тем, что статические анализаторы кода могут получить неверное представление о f
, вы можете использовать те же параметры для фабрики:
def f(a, b, c=object()): #@UnusedVariable
sentinel = object()
def tmp(a, b, c=sentinel):
if c is sentinel:
c = g(b)
return tmp
f = f(23, 42)