None 的默认参数替代?
Default argument alternative to None?
我写的函数有点像这样:
def parse(string, default=None):
try:
... # Body of function here
except ParseError:
if default is not None:
return default
raise
但是如果我真的想要 return 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
),但我不知道怎么做。
使用关键字参数怎么样,然后你可以检查用户是否传递了任何东西:
def parse(string, **kw):
try:
... # Body of function here
except ParseError:
if 'default' in kw:
return kw['default']
raise
缺点是,如果有人拼错,你将无法理解 default
。
除非你经常需要忽略 ParseError
,否则我会让 parse
一直抛出,并且只在我需要的地方捕获它:
try:
parse(sys.argv[4])
except ParseError:
if not flag.ignore_invalid:
raise
虽然如果你必须有一个默认值,那么 _DEFAULT
解决方案就可以了。
我写的函数有点像这样:
def parse(string, default=None):
try:
... # Body of function here
except ParseError:
if default is not None:
return default
raise
但是如果我真的想要 return 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
),但我不知道怎么做。
使用关键字参数怎么样,然后你可以检查用户是否传递了任何东西:
def parse(string, **kw):
try:
... # Body of function here
except ParseError:
if 'default' in kw:
return kw['default']
raise
缺点是,如果有人拼错,你将无法理解 default
。
除非你经常需要忽略 ParseError
,否则我会让 parse
一直抛出,并且只在我需要的地方捕获它:
try:
parse(sys.argv[4])
except ParseError:
if not flag.ignore_invalid:
raise
虽然如果你必须有一个默认值,那么 _DEFAULT
解决方案就可以了。