确保用户在 Python 中指定一个且仅一个函数参数的最佳方法

问题描述 投票:0回答:4

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 表达这一点?

python python-3.x function parameter-passing
4个回答
2
投票

您可以在

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')

2
投票

你在这里做错了很多。 您可以测试

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')

0
投票

极其简单的 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)

现在可能有更好的解决方案,但如果没有更多细节就无法判断......


0
投票

这个怎么样:

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")

    ...
© www.soinside.com 2019 - 2024. All rights reserved.