В теории, можно обернуть эту функцию в функции типа объекта с __call__
, что делегаты функции и __bool__
, что поднимает TypeError. Это было бы действительно громоздким и, вероятно, вызвало бы более плохие взаимодействия, чем это могло бы уловить - например, эти объекты не будут работать как методы, если вы не добавите для них особого режима, - но вы могли бы это сделать:
class NonBooleanFunction(object):
"""A function wrapper that prevents a function from being interpreted as a boolean."""
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
def __bool__(self):
raise TypeError
__nonzero__ = __bool__
@NonBooleanFunction
def is_nighttime():
return True # We're at the Sun-Earth L2 point or something.
if is_nighttime:
# TypeError!
Там еще много вещей, вы не можете поймать:
nighttime_list.append(is_nighttime) # No TypeError ._.
И вы должны помнить, чтобы явно применить это к любой функции, которые вы не хотите рассматриваются как булевы. Вы также не можете многое делать о функциях и методах, которые вы не контролируете; например, вы не можете применить это к str.islower
, чтобы поймать такие вещи, как if some_string.islower:
.
Если вы хотите поймать такие вещи, я рекомендую вместо этого использовать инструменты статического анализа. Я думаю, что IDE, такие как PyCharm, могут вас предупредить, и там должны быть инструменты для линтинга, которые могут поймать это.
Если вы хотите, чтобы эти вещи работают как методы, вот дополнительная обработка для этого:
import functools
class NonBooleanFunction(object):
... # other methods omitted for brevity
def __get__(self, instance, owner):
if instance is None:
return self
return NonBooleanFunction(functools.partial(self.func, instance))
Вы забыли '()' для вызова функции. Объекты функций всегда правдивы. – TigerhawkT3
Не должен ли код быть 'if is_nighttime():'? Или вы хотите каким-то образом предотвратить этот непреднамеренный тип? – NikoNyrh
Нет. Если вы хотите поймать это, запустите linter. Точно так же вы не сможете предотвратить случайное включение функции в список или случайно распечатать функцию в stdout. – user2357112