Введите аннотацию, когда я знаю, что это в конкретном случаеPython

Программы на Python
Anonymous
Введите аннотацию, когда я знаю, что это в конкретном случае

Сообщение Anonymous »

У меня есть функция, которая читает файл JSON и возвращает либо словарь, либо список, в зависимости от содержимого файла. Вот функция:

Код: Выделить всё

from typing import Union
import json

def read_json_file(filename)->Union[dict, list]:
with open(filename) as f:
return json.load(f)
Я использую эту функцию для чтения файла JSON, который, как я знаю, содержит список, например:

Код: Выделить всё

def get_name_list()->list:
return read_json_file("name_list.json")        
Я попробовал несколько решений вроде:
[code]def read_json_file(filename, ensure_type)->Union[dict, list]:
with open(filename) as f:
answer = json.load(f)
hack:ensure_type  = answer
return hack

def get_name_list()->list:
return read_json_file("name_list.json", ensure_type=list)
Это не работает.
Неудовлетворительное решение 2
ChatGPT рекомендовал мне такое решение:< /p>

Код: Выделить всё

from typing import TypeVar, Union, List, Dict, Type
import json

T = TypeVar('T', List, Dict)

def read_json(filename, ensure_type: Type[T]=str) -> T:
with open(filename) as f:
answer = json.load(f)
if ensure_type != str:
assert(isinstance(answer, ensure_type))
answer: T = answer
return answer

def get_list() -> List:
return read_json("name_list.json", ensure_type=list)

def get_json(filename):
return read_json(filename)

foo = get_list()
print(foo)
bar = get_json("bonjour.json")
print(bar)
Это делает работу, НО: тип возвращаемого значения read_json_file плохо читается. Я предпочитаю оставить ->Union[list,dict], что более явно.
Неудовлетворительное решение 3
Я могу это сделать :

Код: Выделить всё

def read_list():
answer:list = read_json_file("name_list.json") #type:ignore
return answer
Но это не совсем удовлетворительно.

Подробнее здесь: https://stackoverflow.com/questions/758 ... cular-case

Вернуться в «Python»