2015-05-11 5 views
3

Я пишу функцию немного как это:По умолчанию аргумент альтернативу 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), но я не знаю, как это сделать.

+3

'object' является разумным дозорным, если' None' не подходит - обратите внимание, что вы можете использовать 'default = object' (т.е. класс), а не' default = _DEFAULT' (экземпляр), чтобы сохранить дополнительное назначение , 'object is object' тоже, что позволяет избежать проблем с возвращаемыми значениями с нечетными реализациями' __eq__'. Связано: http://stackoverflow.com/q/1118454/3001761 – jonrsharpe

+2

Ваш '_DEFAULT' - вполне разумный способ пойти. – khelwood

+1

Значение по умолчанию просто должно быть значением, которое может * никогда не быть допустимым аргументом, переданным вызывающим. Пользовательский экземпляр работает хорошо, потому что вызывающий, в то время как вызывающий может теоретически создать объект, равный * вашему дозорному, он никогда не сможет создать тот, который 'является вашим дозорным. И если он явно называет метод ссылкой со своим дозорным, ну, это вряд ли ваша проблема :) – chepner

ответ

1

Если вы не часто нуждаясь игнорировать ParseError, я бы просто позволить parse бросить все время, и только поймать его в тех местах, мне нужно:

try: 
    parse(sys.argv[4]) 
except ParseError: 
    if not flag.ignore_invalid: 
     raise 

Хотя, если вам необходимо иметь значение по умолчанию, то решение _DEFAULT в порядке.

+0

Я думаю, что рефакторинг всего моего кода был правильным. –

1

Как об использовании параметров ключевых слов, то вы можете проверить, прошел ли пользователь что-нибудь вообще:

def parse(string, **kw): 
    try: 
     ... # Body of function here 
    except ParseError: 
     if 'default' in kw: 
      return kw['default'] 
     raise 

недостатком является то, что вы не поймаете, если кто-нибудь misspells default.

Смежные вопросы