在
some_function
中,我有两个参数freq
和frac
,我不希望用户指定它们两个,或者都不指定。我希望他们只指定其中之一。
这是工作代码:
def some_function(freq=False, frac=False):
if (freq is False) & (frac is False):
return (str(ValueError)+': Both freq and frac are not specified')
elif (freq is not False) & (frac is not False):
return (str(ValueError)+': Both freq and frac are specified')
elif (freq is not False) & (frac is False):
try:
print ('Do something')
except Exception as e:
print (e)
elif (freq is False) & (frac is not False):
try:
print ('Do something else')
except Exception as e:
print (e)
else: return (str(ValueError)+': Undetermined error')
是否有更好、更简洁的实践来用 Python 表达这一点?
您可以在
assert
语句之前使用 if
。您的输入类型不清楚;一般来说,如果我知道这不是有效的输入,我会使用 None
。
def some_function(freq=None, frac=None):
freq_flag = freq is not None
frac_flag = frac is not None
assert freq_flag + frac_flag == 1, "Specify exactly one of freq or frac"
if freq_flag:
print('Do something')
elif frac_flag:
print('Do something else')
你在这里做错了很多。 您可以测试
not frac
而不是 frac is False
,您应该使用逻辑 and
而不是按位 &
,并且您应该提高这些 ValueError
,而不是返回它们:
def some_function(freq=False, frac=False):
if not freq and not frac:
raise ValueError('Both freq and frac are not specified')
elif freq and frac:
raise ValueError('Both freq and frac are specified')
elif freq:
print ('Do something')
else:
print ('Do something else')
一般来说,您正在寻找两个选项之一。 为什么不要求用户传递一个布尔值,然后表示
freq
if True
和 frac
if False
?
def some_function(freq):
if freq:
print ('Do something')
else:
print ('Do something else')
极其简单的 Python 解决方案:使用两个不同的函数(它们最终可能只是真正函数的外观):
__all__ = ["freqfunc", "fracfunc"]
# private implementation
def _somefunc(freq=False, frac=False):
# your code here
def freqfunc(freq):
return _somefunc(freq=freq)
def fraqfunc(frac):
return _somefunc(frac=frac)
现在可能有更好的解决方案,但如果没有更多细节就无法判断......
这个怎么样:
def some_function(freq=None, frac=None):
if (freq is None) is (frac is None):
raise ValueError("one and only one of parameters should be provided")
...