Создать рекурсивные типы во время выполнения [дублировать]Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Создать рекурсивные типы во время выполнения [дублировать]

Сообщение Anonymous »

Для использования с Pydantic я хочу создать псевдонимы рекурсивного типа во время выполнения.
«Нормальные» псевдонимы типа возможны, как это: < /p>

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

from typing import TypeAliasType

alias = TypeAliasType("alias", str)
foo: alias = "bar"
< /code>
Но теперь я хочу создать псевдоним рекурсивного типа, как этот: < /p>
from collections.abc import Sequence

type recursive = int | Sequence[recursive]
< /code>
Это включает в себя прямую ссылку, которую я нашел невозможным для эмуляции во время выполнения. Существует ForwardRef 
, но, кроме того, что он не поощрял, это не сработало для меня:

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

from typing import ForwardRef, TypeAliasType
from collections.abc import Sequence

# This is what I want to emulate at runtime
type recursive = int | Sequence[recursive]
print(recursive.__value__) # int | collections.abc.Sequence[recursive]

# This is my (failing) attempt to emulate it at runtime
dynamic_list_of_types = float | int
ref = ForwardRef("recursive")
recursive = TypeAliasType("recursive", dynamic_list_of_types | Sequence[ref])
print(recursive.__value__)  # float | int | collections.abc.Sequence[ForwardRef('recursive')]
< /code>
Как я могу объявить такой псевдоним рекурсивного типа во время выполнения? Поскольку список разрешенных типов (Dynamic_list_of_types 
в моем примере выше) не является фиксированным, но может быть расширен динамически, это невозможно здесь. Эта модель имеет некоторые поля, такие как MyList: Sequence [mytypealias] , где Mytypealias описывает союз разрешенных типов. Плагины теперь должны расширить этот список разрешенных типов с помощью своих собственных моделей. Решение, к которому я стремлюсь собрать этот список и заменить все события Mytypealias на обновленное союз. Это работает хорошо, за исключением рекурсивных типов, упомянутых здесь. Другие варианты, чтобы вручную отметить все такие события (которые есть много), уменьшат читаемость в моделях основного пакета, поэтому я выбрал этот подход.


Подробнее здесь: https://stackoverflow.com/questions/797 ... at-runtime
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Рекурсивные типы в Python и трудности с определением типа `type(x)(...)`
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Рекурсивные типы в Python и трудности с определением типа `type(x)(...)`
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Рекурсивные универсальные типы
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Быстро запоминайте анонимные рекурсивные функции с помощью лямбда-выражений и «функции исправления».
    Anonymous » » в форуме C++
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Рекурсивные и глобальные PHP-коды не работают на всех страницах
    Anonymous » » в форуме Php
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous

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