Я пишу функцию немного как это:По умолчанию аргумент альтернативу None?
def parse(string, default=None):
try:
... # Body of function here
except ParseError:
if default is not None:
return default
raise
Но тогда я столкнулся с проблемами, если я на самом деле хочу, чтобы функция возвращала None
.
if len(sys.argv) > 4:
if flag.ignore_invalid:
result = parse(sys.argv[4], None) # Still raises error
else:
result = parse(sys.argv[4])
То, что я попытался исправить это:
_DEFAULT = object()
def parse(string, default=_DEFAULT):
...
if default is not _DEFAULT:
...
Но это, кажется, что я overthinking его, и, кажется, есть более простой способ сделать это.
Функции any
и all
делают это (разрешение по умолчанию None
), но я не знаю, как это сделать.
'object' является разумным дозорным, если' None' не подходит - обратите внимание, что вы можете использовать 'default = object' (т.е. класс), а не' default = _DEFAULT' (экземпляр), чтобы сохранить дополнительное назначение , 'object is object' тоже, что позволяет избежать проблем с возвращаемыми значениями с нечетными реализациями' __eq__'. Связано: http://stackoverflow.com/q/1118454/3001761 – jonrsharpe
Ваш '_DEFAULT' - вполне разумный способ пойти. – khelwood
Значение по умолчанию просто должно быть значением, которое может * никогда не быть допустимым аргументом, переданным вызывающим. Пользовательский экземпляр работает хорошо, потому что вызывающий, в то время как вызывающий может теоретически создать объект, равный * вашему дозорному, он никогда не сможет создать тот, который 'является вашим дозорным. И если он явно называет метод ссылкой со своим дозорным, ну, это вряд ли ваша проблема :) – chepner