我正在将列表中的关键元素与字典键进行比较
event_test = {
"EventType": "ShipmentDueDate",
"Endpoint": "https://example.net"
}
events_list = ['EventType','Endpoint']
body = "https"
我写了一个自定义函数如下
def validate_input(event_keys,body):
count = 0
for list_item in events_list:
if list_item in event_keys:
count+= 1
if count != len(events_list):
print("One/All of: 'EventType','Endpoint' parameters are missing.")
if not "https" in body:
print("Only https endpoints are accepted")
return bool
我想执行我的代码的另一部分,只有在函数执行时没有任何错误。我不明白如何为函数指定返回值并根据返回值执行我的代码
我正在尝试:先调用我的函数
validate_response = validate_input(list(event_test.keys()),body)
if validate_response == False:
print("error in your input")
try:
print("execute my rest of the code")
这是正确的做法吗?
答案 0 :(得分:1)
首先,您从未在代码示例中定义 bool
的值。 bool
是一个内置函数,因此 validate_input
实际上总是返回函数 bool
,这将导致程序无法按预期工作。
实现这一点的更好方法是,如果满足任一错误条件,则返回 False
,否则返回 True
,如下所示:
def validate_input(event_keys,body):
count = 0
for list_item in events_list:
if list_item in event_keys:
count+= 1
if count != len(events_list):
print("One/All of: 'EventType','Endpoint' parameters are missing.")
return False
if not "https" in body:
print("Only https endpoints are accepted")
return False
return True
此外,validate_input
实际上并没有引发任何异常,它只是根据函数参数是否有效而返回 True
或 False
。不需要 try-except
语句;您可以简单地使用 if-else
语句,如下所示:
if validate_response:
print("execute my rest of the code")
else:
print("error in your input")
通过上述更改,如果 "error in your input"
为 validate_response
,将打印 False
。如果在 validate_input
中找到的所有项目也存在于参数 True
中,并且 events_list
在 event_keys
中,"https"
将返回 body
。
答案 1 :(得分:1)
首先,我看到了几个问题
1.您的评估条件存在问题(您缺少 else
)
if validate_response == False:
print("error in your input")
else:
print("execute my rest of the code")
2.您的函数未返回 True
或 False
并且在检查“https”时未正确使用 not in
运算符
def validate_input(event_keys,body):
count = 0
for list_item in events_list:
if list_item in event_keys:
count+= 1
if count != len(events_list):
print("One/All of: 'EventType','Endpoint' parameters are missing.")
return False
if "https" not in body:
print("Only https endpoints are accepted")
return False
return True
继续……
我有点不清楚你所说的“正确方式”
我会尝试一下,并假设您指的是降低示例中的复杂性和/或代码行数...
您可以尝试使用以下“优化”
更改函数以使用列表推导式
注意:我确实将“body”函数参数的名称更改为“body_str”,因为它从外部作用域遮蔽了 body 变量。请根据经验避免这种情况
def validate_input(event_keys, body_str):
count = len([x for x in events_list if x in event_keys])
# print count to debug
print(f"Count is {count}")
if count != len(events_list):
print("One/All of: 'EventType','Endpoint' parameters are missing.")
return False
if "https" not in body_str:
print("Only https endpoints are accepted")
return False
return True
以下行本质上返回一个与您的 if 条件匹配的元素的新列表,然后使用 len 操作来计算与所述条件匹配的元素的数量
count = len([x for x in events_list if x in event_keys])
改变你的评价
一种可能性(我个人会使用这个)
if not validate_response:
print("error in your input")
else:
print("execute my rest of the code")
另一种可能性是完全摆脱临时变量赋值——虽然降低了可读性
# validate_response = validate_input(list(event_test.keys()),body)
if not validate_input(list(event_test.keys()), body_str):
print("error in your input")
else:
print("execute my rest of the code")