Я пишу фреймворк, который вызывает код, написанный другими людьми (структура играет монополию и звонит в AI игрока). ИИ сообщают структуре, что делать в возвращаемых значениях вызовов функций.Python: проверка типов сложных возвращаемых значений
Я хотел бы проверить типы возвращаемых значений, чтобы убедиться, что они не взорвут мой код рамки.
Например:
instructions = player.sell_houses()
# Process the instructions...
В этом примере я ожидал игрок возвращает список кортежей, таких как:
[(Square.BOW_STREET, 2), (Square.MARLBOROUGH_STREET, 2), (Square.VINE_STREET, 1)]
Есть Симпл (МОГ) способ проверить, что ИИ возвращается ко мне? Я представляю что-то вроде этого:
instructions = player.sell_houses()
if not typecheck(instructions, [(str, int)]):
# Data was not valid...
Я не просто хочу проверить, что возвращаемые данные представляют собой список. Я хочу проверить, что это список определенного типа. В примере это список кортежей, где каждый кортеж содержит строку и целое число.
Я видел, что многие вопросы проверки типа Python получают ответ «проверка типа - это зло». Если да, то что я должен делать в этом случае? Кажется, что ничего не мешает AI-коду возвращать абсолютно что-либо, и я должен быть в состоянии проверить или справиться с ним каким-то образом.
Редактировать: Я могу проверить это «вручную», написав функцию. Для instructions
над ним может быть что-то вроде этого:
def is_valid(instructions):
if not isinstance(instructions, list): return False
for item in instructions:
if not isinstance(item, tuple): return False
if len(item) != 2: return False
if not isinstance(item[0], str): return False
if not isinstance(item[1], int): return False
return True
Но в этом случае, я должен был бы написать так же сложную функцию проверки для каждого типа значения, мне нужно проверить. Поэтому мне интересно, существует ли более общая функция проверки или библиотека, где я могу дать ей выражение (например, [(str, int)]
), и он будет проверять его, не выполняя работу вручную.
Если у кого-то есть лучшая версия этого (что, возможно, справляется с большим количеством типов) или библиотеку, которая делает что-то подобное, пожалуйста, дайте мне знать! –
Это отличное решение .. я не понимаю, почему вам даже нужно спрашивать здесь :) – aIKid