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.")
这里还有两种可能的方法 第一个前任