返回自定义函数的布尔值

时间:2021-02-17 00:34:19

标签: python python-3.x function dictionary return

我正在将列表中的关键元素与字典键进行比较

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

这是正确的做法吗?

2 个答案:

答案 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 实际上并没有引发任何异常,它只是根据函数参数是否有效而返回 TrueFalse。不需要 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_listevent_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.您的函数未返回 TrueFalse 并且在检查“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")