возвращает логическое значение для пользовательской функции

#python #python-3.x #function #dictionary #return

#python #python-3.x #функция #словарь #Возврат

Вопрос:

Я сравниваю ключевые элементы в списке с ключами словаря

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

Это правильный способ сделать?

Ответ №1:

Перво-наперво, я вижу пару проблем

1. Существует проблема с вашим условием оценки (вам не хватает else )

 if validate_response == False:
    print("error in your input")
else:
    print("execute my rest of the code")
 

2. Ваша функция не возвращает True or, False И not in оператор используется неправильно при проверке «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.")
        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")
 

Ответ №2:

Во-первых, вы никогда не определяли значение 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 .