Python 函数中只允许一个真参数

Python 函数中只允许一个真参数,python,validation,arguments,Python,Validation,Arguments,鉴于以下功能: def controls_validation(creation_mode=False, existence_mode=False, integrity_mode=False): if creation_mode: # Do X elif existence_mode: # Do Y elif integrity_mode: # Do Z else: raise ValueError(

鉴于以下功能:

def controls_validation(creation_mode=False, existence_mode=False, integrity_mode=False):
    if creation_mode:
        # Do X
    elif existence_mode:
        # Do Y
    elif integrity_mode:
        # Do Z
    else:
        raise ValueError("At least one arg required.")
我想验证参数,以便只允许一个真参数。当然,我的else/elif语句有一个特定的顺序,我不希望用户例如将“creation_mode”和“integrity_mode”设置为True,从而使函数愉快地执行X,因为“creation mode”是第一位的,尽管有明显的错误,而且很有可能功能无法验证用户想要验证的模式

我已经读到,在Python中验证参数不是一件应该做的事情,除非您有非常具体的原因。我应该费心做这件事吗?还是用户有责任阅读文档并知道如何使用


提前感谢您的意见。

这是否更接近您想要的:

def controls_validation(creation_mode=False, existence_mode=False, integrity_mode=False):
    if creation_mode and not existence_mode and not integrity_mode:
        print("creation")
    elif existence_mode and not creation_mode and not integrity_mode:
        print("existence")
    elif integrity_mode and not creation_mode and not existence_mode:
        print("integrity")
    else:
        raise ValueError("At least one arg required.")
这将确保只输入一个参数为真,而其他参数为假

我会考虑使用<代码>尝试,<代码>,除了。因此,在不正确的条目时,它不会终止程序。这完全取决于您在执行时是否正在寻找来自用户的直接输入

如果你想要更具可扩展性的东西,那么你可以从这个开始并改进它

def controls_validation(mode):
    modes = ['creation_mode', 'existence_mode', 'integrity_mode']
    check = mode.split()
    count = 0
    for w in check:
        count += 1
    if count == 1:
        if mode == 'creation_mode':
            print('creation_mode')
        elif mode == 'existence_mode':
            print('existence_mode')
        elif mode == 'integrity_mode':
            print('integrity_mode')
        else:
            pass
    else:
        raise ValueError("At least one arg required.")
再次强调:

def controls_validation(mode):
    m = ['creation_mode', 'existence_mode', 'integrity_mode']
    check = mode.split()
    if len([v for v in check if mode in m]) is 1:
        if mode == 'creation_mode':
            print('creation_mode')
        elif mode == 'existence_mode':
            print('existence_mode')
        elif mode == 'integrity_mode':
            print('integrity_mode')
        else:
            pass
    else:
        raise ValueError("At least one arg required.")

这是否更接近您想要的:

def controls_validation(creation_mode=False, existence_mode=False, integrity_mode=False):
    if creation_mode and not existence_mode and not integrity_mode:
        print("creation")
    elif existence_mode and not creation_mode and not integrity_mode:
        print("existence")
    elif integrity_mode and not creation_mode and not existence_mode:
        print("integrity")
    else:
        raise ValueError("At least one arg required.")
这将确保只输入一个参数为真,而其他参数为假

我会考虑使用<代码>尝试,<代码>,除了。因此,在不正确的条目时,它不会终止程序。这完全取决于您在执行时是否正在寻找来自用户的直接输入

如果你想要更具可扩展性的东西,那么你可以从这个开始并改进它

def controls_validation(mode):
    modes = ['creation_mode', 'existence_mode', 'integrity_mode']
    check = mode.split()
    count = 0
    for w in check:
        count += 1
    if count == 1:
        if mode == 'creation_mode':
            print('creation_mode')
        elif mode == 'existence_mode':
            print('existence_mode')
        elif mode == 'integrity_mode':
            print('integrity_mode')
        else:
            pass
    else:
        raise ValueError("At least one arg required.")
再次强调:

def controls_validation(mode):
    m = ['creation_mode', 'existence_mode', 'integrity_mode']
    check = mode.split()
    if len([v for v in check if mode in m]) is 1:
        if mode == 'creation_mode':
            print('creation_mode')
        elif mode == 'existence_mode':
            print('existence_mode')
        elif mode == 'integrity_mode':
            print('integrity_mode')
        else:
            pass
    else:
        raise ValueError("At least one arg required.")

这是否更接近您想要的:

def controls_validation(creation_mode=False, existence_mode=False, integrity_mode=False):
    if creation_mode and not existence_mode and not integrity_mode:
        print("creation")
    elif existence_mode and not creation_mode and not integrity_mode:
        print("existence")
    elif integrity_mode and not creation_mode and not existence_mode:
        print("integrity")
    else:
        raise ValueError("At least one arg required.")
这将确保只输入一个参数为真,而其他参数为假

我会考虑使用<代码>尝试,<代码>,除了。因此,在不正确的条目时,它不会终止程序。这完全取决于您在执行时是否正在寻找来自用户的直接输入

如果你想要更具可扩展性的东西,那么你可以从这个开始并改进它

def controls_validation(mode):
    modes = ['creation_mode', 'existence_mode', 'integrity_mode']
    check = mode.split()
    count = 0
    for w in check:
        count += 1
    if count == 1:
        if mode == 'creation_mode':
            print('creation_mode')
        elif mode == 'existence_mode':
            print('existence_mode')
        elif mode == 'integrity_mode':
            print('integrity_mode')
        else:
            pass
    else:
        raise ValueError("At least one arg required.")
再次强调:

def controls_validation(mode):
    m = ['creation_mode', 'existence_mode', 'integrity_mode']
    check = mode.split()
    if len([v for v in check if mode in m]) is 1:
        if mode == 'creation_mode':
            print('creation_mode')
        elif mode == 'existence_mode':
            print('existence_mode')
        elif mode == 'integrity_mode':
            print('integrity_mode')
        else:
            pass
    else:
        raise ValueError("At least one arg required.")

这是否更接近您想要的:

def controls_validation(creation_mode=False, existence_mode=False, integrity_mode=False):
    if creation_mode and not existence_mode and not integrity_mode:
        print("creation")
    elif existence_mode and not creation_mode and not integrity_mode:
        print("existence")
    elif integrity_mode and not creation_mode and not existence_mode:
        print("integrity")
    else:
        raise ValueError("At least one arg required.")
这将确保只输入一个参数为真,而其他参数为假

我会考虑使用<代码>尝试,<代码>,除了。因此,在不正确的条目时,它不会终止程序。这完全取决于您在执行时是否正在寻找来自用户的直接输入

如果你想要更具可扩展性的东西,那么你可以从这个开始并改进它

def controls_validation(mode):
    modes = ['creation_mode', 'existence_mode', 'integrity_mode']
    check = mode.split()
    count = 0
    for w in check:
        count += 1
    if count == 1:
        if mode == 'creation_mode':
            print('creation_mode')
        elif mode == 'existence_mode':
            print('existence_mode')
        elif mode == 'integrity_mode':
            print('integrity_mode')
        else:
            pass
    else:
        raise ValueError("At least one arg required.")
再次强调:

def controls_validation(mode):
    m = ['creation_mode', 'existence_mode', 'integrity_mode']
    check = mode.split()
    if len([v for v in check if mode in m]) is 1:
        if mode == 'creation_mode':
            print('creation_mode')
        elif mode == 'existence_mode':
            print('existence_mode')
        elif mode == 'integrity_mode':
            print('integrity_mode')
        else:
            pass
    else:
        raise ValueError("At least one arg required.")

当我们说您不想对输入进行验证时,我们的想法是您可以重新组织您的代码,这样大部分验证就没有必要了。例如,假设您将其拆分为3个函数,如下所示

def create_mode():
    # Do X

def existence_mode():
    # Do Y

def integrity_mode():
    # Do Z

由于函数的名称以及它们必须按名称显式调用函数的事实,它们传递错误参数的可能性很小。因此,几乎不需要验证。事实上,在这个例子中,似乎根本没有参数,所以零验证。

当我们说您不想对输入进行验证时,我们的想法是您可能可以重新组织代码,这样大部分验证就没有必要了。例如,假设您将其拆分为3个函数,如下所示

def create_mode():
    # Do X

def existence_mode():
    # Do Y

def integrity_mode():
    # Do Z

由于函数的名称以及它们必须按名称显式调用函数的事实,它们传递错误参数的可能性很小。因此,几乎不需要验证。事实上,在这个例子中,似乎根本没有参数,所以零验证。

当我们说您不想对输入进行验证时,我们的想法是您可能可以重新组织代码,这样大部分验证就没有必要了。例如,假设您将其拆分为3个函数,如下所示

def create_mode():
    # Do X

def existence_mode():
    # Do Y

def integrity_mode():
    # Do Z

由于函数的名称以及它们必须按名称显式调用函数的事实,它们传递错误参数的可能性很小。因此,几乎不需要验证。事实上,在这个例子中,似乎根本没有参数,所以零验证。

当我们说您不想对输入进行验证时,我们的想法是您可能可以重新组织代码,这样大部分验证就没有必要了。例如,假设您将其拆分为3个函数,如下所示

def create_mode():
    # Do X

def existence_mode():
    # Do Y

def integrity_mode():
    # Do Z

由于函数的名称以及它们必须按名称显式调用函数的事实,它们传递错误参数的可能性很小。因此,几乎不需要验证。事实上,在这个例子中,似乎根本没有参数,所以零验证。

这里有两种可能的方法

第一个示例确保通过将模式作为单个参数传递,只能操作一个模式。这将使将来更容易添加更多模式

creation_mode = 1
existence_mode = 2
integrity_mode = 3

def controls_validation_v2(mode):

    if mode == creation_mode:
        print("creation")
    elif mode == existence_mode:
        print("existence")
    elif mode == integrity_mode:
        print("integrity")
    else:
        raise ValueError("invalid mode")

controls_validation_v2(creation_mode)
第二种方法不那么明显。布尔变量确实等于0或1,因此可以使用它来合计它们的值,以确保合计值正好为1。除非代码被更改,否则决不应到达提升

def controls_validation_v3(creation_mode=False, existence_mode=False, integrity_mode=False):

    if creation_mode + existence_mode + integrity_mode != 1:
        print("only one true argument is allowed")
    elif creation_mode:
        print("creation")
    elif existence_mode:
        print("existence")
    elif integrity_mode:
        print("integrity")
    else:
        raise ValueError("At least one arg required.")

这里还有两种可能的方法

第一个示例确保通过将模式作为单个参数传递,只能操作一个模式。这将使将来更容易添加更多模式

creation_mode = 1
existence_mode = 2
integrity_mode = 3

def controls_validation_v2(mode):

    if mode == creation_mode:
        print("creation")
    elif mode == existence_mode:
        print("existence")
    elif mode == integrity_mode:
        print("integrity")
    else:
        raise ValueError("invalid mode")

controls_validation_v2(creation_mode)
第二种方法不那么明显。布尔变量确实等于0或1,因此可以使用它来合计它们的值,以确保合计值正好为1。除非代码被更改,否则决不应到达提升

def controls_validation_v3(creation_mode=False, existence_mode=False, integrity_mode=False):

    if creation_mode + existence_mode + integrity_mode != 1:
        print("only one true argument is allowed")
    elif creation_mode:
        print("creation")
    elif existence_mode:
        print("existence")
    elif integrity_mode:
        print("integrity")
    else:
        raise ValueError("At least one arg required.")

这里还有两种可能的方法

第一个前任