[pyar] NamedTuple de tipo generico?

Daniel Moisset dmoisset en machinalis.com
Vie Ene 5 13:59:21 ART 2018


Por como se implementaron Generics (inicialmente como un experimento al
lado, y tratando de no tocar el interprete) no se puede de forma facil
lograr lo que queres (tendrías que definir tu propia metaclase que herede
de GenericMeta y NamedTupleMeta, fusionar la funcionalidad de ambas, y
hacer esa la metaclase de tu clase Node).

Eso va a cambiar en versiones futuras: se aprobó PEP 560 , y eso agregando
algunas cositas al interprete va a simplificar mucho la implementacion
runtime del modulo typing, y entre otras cosas no va a hacer falta que
Generic use una metaclass especial. Con eso podríás hacer la definición

Igual, algo que charlaba con la gente de mypy es que el soporte de
tuplas/namedtuplas genericas esta medio incompleto (pero eso ya es a nivel
chequeador, tu codigo va a correr bien), así que ahi puede que tambien haga
falta tiempo extra si estas usando estas anotaciones con mypy.

Saludos,
    D.

2018-01-04 16:10 GMT+00:00 marcos hipe <marcoshipe en gmail.com>:

> Buenas!
> Estuve indagando en el tema de type hints y me encontré con un problema,
> quería hacer una NamedTuple que tenga un ítem de un tipo genérico, pero si
> hago eso me tira el indescifrable error: "TypeError: metaclass conflict:
> the metaclass of a derived class must be a (non-strict) subclass of the
> metaclasses of all its bases"
>
> Estoy haciendo algo mal?
>
> El código que use es:
>
> class State(abc.ABC):
>     pass
>
> State_T = TypeVar('State_T', bound=State)
>
> class Node(Generic[State_T], NamedTuple):
>     state: State_T
>     path: List[str]
>     cost: int
>
> O sea que tengo un Node que tiene un ítem que es de tipo State o derivado.
> Si, quizás un poco quisquilloso con querer eso, cuando si lo hago con una
> clase común anda perfecto:
>
> class State(abc.ABC):
>     pass
>
> State_T = TypeVar('State_T', bound=State)
>
> class Node(Generic[State_T]):
>     def __init__(self, state: State_T, path: List[str], cost: int):
>         self.state: State_T = state
>         self.path: List[str] = path
>         self.cost: int = cost
>
> Ya en mi código lo deje así con una clase común, pero me quede con la duda
> de si estoy haciendo algo mal o si eso debería andar
> Saludos!
>
> _______________________________________________
> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
> Sitio web: http://www.python.org.ar/
>
> Para administrar la lista (o desuscribirse) entrar a
> http://listas.python.org.ar/listinfo/pyar
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>



-- 
Daniel F. Moisset - UK Country Manager - Machinalis Limited
www.machinalis.co.uk <http://www.machinalis.com>
Skype: @dmoisset T: + 44 7398 827139

1 Fore St, London, EC2Y 9DT

Machinalis Limited is a company registered in England and Wales. Registered
number: 10574987.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20180105/69e1875b/attachment.html>


Más información sobre la lista de distribución pyar