Nano Hash - криптовалюты, майнинг, программирование

доступ к типу набора текста. Список

В настоящее время я пишу код, и мне нужно знать, является ли аннотация данного типа итерируемой (например, ta = typing.List[str])

Я ожидал чего-н. вот так для работы:

if isinstance(ta, typing.List):
    # do s.th.

Однако ta имеет тип typing._GenericAlias, который не имеет большого отношения к набору текста.List.

Вместо этого я должен использовать атрибут origin следующим образом:

if getattr(ta, '__origin__', None) == list:
    # do s.th.

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

21.08.2018

  • Ну, считай, что isinstance(list, Iterable) аналогично не сработает... 21.08.2018
  • Я знаю три итерируемых экземпляра: list,str,and dict есть ли какие-то другие?? просто сделай if isinstance(ta, (list,str,dict)): 21.08.2018
  • но ta не является фактическим итерируемым, это подсказка типа typing.List. Перефразируя: я запутался, потому что isinstance(List[str], List) возвращает false... 21.08.2018
  • Из любопытства, что именно вы пытаетесь сделать? Подсказки типа в основном должны быть невидимыми во время выполнения — самоанализ подсказок типа во время выполнения не очень хорошо поддерживается или распространенный вариант использования. 21.08.2018
  • Я использую класс данных python3.7 и люблю запускать его из dict - с вложенными структурами. @dataclass class Foo x: typing.List(Bar) Поскольку у меня есть много вложенных структур (которые я инициализирую из словаря), я бы предпочел не писать отдельные процедуры __post_init__ для каждого вложенного атрибута, а написать новый декоратор (например, nested_dataclass) который создает класс данных атрибута на лету (вдохновленный stackoverflow.com/questions/51564841/ - что точно не учитывает этот момент) 22.08.2018

Ответы:


1

В CPython 3.8:

from typing import_GenericAlias

# Now, let's suppose that you have a class "cls"
name = "your_attribute"
typ = cls.__annotations__[name]
if isinstance(typ, _GenericAlias) and typ._name == "List":
    print("This is a list type")

_GenericAlias — это защищенный/сгенерированный класс, который не документирован. Это деталь реализации. Я не знаю надежного способа доступа к информации о типах во время выполнения.

05.04.2020
  • Вопрос был не в этом, но вы можете найти marshmallow.readthedocs.io/en/stable. лучше подходит для ваших нужд. У него более 4500 звезд на GitHub. Существуют и другие подобные библиотеки, которые предоставляют информацию о типе времени выполнения. (Но тогда вы можете потерять проверку типов в своей среде IDE.) 06.04.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..