Я пишу функцию примерно так:
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:
...
Но это похоже на то, что я слишком много думаю об этом, и кажется, что есть более простой способ сделать это.
Это делают функции any
и all
(разрешая None
по умолчанию), но я не знаю, как это сделать.
object
является разумным дозорным, еслиNone
не подходит - обратите внимание, что вы можете использоватьdefault=object
(то есть класс), а неdefault=_DEFAULT
(экземпляр), чтобы сохранить дополнительное назначение.object is object
, что позволяет избежать проблем с возвращаемыми значениями в нечетных реализациях__eq__
. Связано: stackoverflow.com/q/1118454/3001761 - person jonrsharpe   schedule 11.05.2015_DEFAULT
— вполне разумный путь. - person khelwood   schedule 11.05.2015is
будет вашим дозорным. А если он явно вызывает метод со ссылкой на ваш сентинел, ну вряд ли это ваша проблема :) - person chepner   schedule 11.05.2015