[PyVigo] [Hola] + [PyCharm type hinting]

David de la Iglesia daviddelaiglesiacastro en gmail.com
Mie Dic 9 10:26:07 CET 2020


En el primer snippet en lugar de ProvidedAnimals tendría que poner Animal,
problemas de copy paste

O mér., 9 de dec. de 2020 ás 10:24, David de la Iglesia (<
daviddelaiglesiacastro en gmail.com>) escribiu:

> Vaya en el correo ctrl+intro no salta línea si no que envía, xD
> El caso creo que no es una issue per se, para conseguir lo que quieres
> deberías crear un TypeVar y "registrar" cada una de las cosas que tu
> provider devuelve.
>
> Usando como ejemplo el código de los docs de mypy y adaptándolo a lo que
> propones (porque me rallan los nombres de repositories xD), genera el mismo
> error:
>
> cat_example.py:37: error: Incompatible types in assignment (expression has
> type "Animal", variable has type "Persa")
> Found 1 error in 1 file (checked 1 source file)
>
> from abc import ABCMeta, abstractmethod
>
> class Animal(metaclass=ABCMeta):
> @abstractmethod
> def eat(self, food: str) -> None: pass
>
> @property
> @abstractmethod
> def can_walk(self) -> bool: pass
>
>
> class Cat(Animal, metaclass=ABCMeta):
> def eat(self, food: str) -> None:
> if food != "tunna":
> raise ValueError
>
> @property
> def can_walk(self) -> bool:
> return True
>
> @property
> @abstractmethod
> def is_fluffy(self) -> bool: pass
>
>
> class Persa(Cat):
> @property
> def is_fluffy(self) -> bool:
> return False
>
>
> def animal_provider(breed: str = "persa") -> ProvidedAnimals:
> if breed == "persa":
> return Persa()
> else:
> raise NotImplementedError
>
>
> def feed_cat(x: Cat):
> x.eat("tunna")
>
> x: Persa
> x = animal_provider()
>
> feed_cat(x)
>
>
>
> Pero añadiendo el typevar ya no hay error. Supongo que puedes crear el
> TypeVar dinámicamente a partir de tu registro de repositorios.
> from typing import TypeVar
> from abc import ABCMeta, abstractmethod
>
> class Animal(metaclass=ABCMeta):
> @abstractmethod
> def eat(self, food: str) -> None: pass
>
> @property
> @abstractmethod
> def can_walk(self) -> bool: pass
>
> class Cat(Animal, metaclass=ABCMeta):
> def eat(self, food: str) -> None:
> if food != "tunna":
> raise ValueError
>
> @property
> def can_walk(self) -> bool:
> return True
>
> @property
> @abstractmethod
> def is_fluffy(self) -> bool: pass
>
> class Persa(Cat):
> @property
> def is_fluffy(self) -> bool:
> return False
>
> ProvidedAnimals = TypeVar("ProvidedAnimals", Animal, Cat, Persa)
>
> def animal_provider(breed: str = "persa") -> ProvidedAnimals:
> if breed == "persa":
> return Persa()
> else:
> raise NotImplementedError
>
>
> def feed_cat(x: Cat):
> x.eat("tunna")
>
> x = animal_provider()
>
> feed_cat(x)
>
> O mér., 9 de dec. de 2020 ás 09:49, David de la Iglesia (<
> daviddelaiglesiacastro en gmail.com>) escribiu:
>
>> Saludos señor.
>> So first, para la definición de metaclasses en Python3 la sintaxis
>> deberías actualizarla (https://www.python.org/dev/peps/pep-3115/). En
>> teoría en el PEP se dice que __metaclass__ va a seguir poder usándose pero
>> puede ser que cualquier plugin o lo que sea ya no "entienda" la sintaxis
>> antigua y la ignore, así que yo creo que mejor actualizar salvo que tengas
>> python2 como dependencia (si es así mejor usar
>> https://six.readthedocs.io/#six.add_metaclass).
>>
>> from abc import ABC, ABCMeta
>>
>> class IRepository(ABC): # or class IRepository(metaclass=ABCMeta):
>>
>> Lo segundo que te puedo decir es que la issue (que no sé si es issue) no
>> es cosa de Pycharm si no de mypy, lo puedes comprobar rulando directamente
>> mypy sobre el archivo en cuestión. Así que básicamente es una issue en
>> cualquier IDE que conozca porque todos usan mypy como motor para el type
>> checking.
>>
>> Lo tercero es que creo que no es una issue. Creo que
>> def repository_provider(name: str) -> IRepository:
>> O mér., 9 de dec. de 2020 ás 02:47, Artur Costa (<
>> acosta en alicebiometrics.com>) escribiu:
>>
>>> Hola,
>>>
>>> Primer mensaje a la lista, así que... encantado :)
>>>
>>> Disclaimer, si este no es el canal para compartir estas dudas y es mejor
>>> el slack por ejemplo, disculpad.
>>>
>>> Bueno, al lío. Uso el PyCharm como IDE y desde hace un tiempo me muestra
>>> un warning que mete un poco de ruido en los constructores semánticos con
>>> los que trabajo.
>>>
>>> [image: pycharm_warning.png]
>>>
>>> Parece que es un tema de que PyCharm no es capaz de resolver una
>>> herencia doble. He creado un snippet rápido en github como ejemplo
>>>
>>> https://github.com/acostapazo/typing-inheritance-example
>>>
>>> He buscado acerca del tema, pero quizás no estoy enfocando bien el tiro.
>>> Entiendo que es una limitación del IDE, pero no lo tengo claro. ¿Alguna
>>> recomendación de por dónde tirar? ¿Desactivo ese warning en PyCharm y me
>>> voy a descansar?
>>>
>>> Un saludo,
>>> Artur
>>>
>>> --
>>>
>>> Artur Costa Pazo
>>>
>>> Engineering Manager
>>>
>>> Ph. (+34) 986 120 430 Ext. 3020
>>>
>>> acosta en alicebiometrics.com  |  www.alicebiometrics.com
>>>
>>> Take care of the environment. Try not to print this email.
>>>
>>> The information contained in this email message may be confidential
>>> information, and may also be the subject of legal professional privilege.
>>> If you are not the intended recipient, any use, interference with,
>>> disclosure or copying of this material is unauthorized and prohibited.
>>> Please inform us immediately and destroy the email. Thank you for your
>>> cooperation.
>>> _______________________________________________
>>> Asociación Python España: https://www.es.python.org/
>>> Python Vigo: https://www.python-vigo.es/
>>> Vigo mailing list
>>> Vigo en lists.es.python.org
>>> https://lists.es.python.org/listinfo/vigo
>>>
>>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <https://lists.es.python.org/pipermail/vigo/attachments/20201209/da6d0da2/attachment-0001.htm>
------------ próxima parte ------------
Se ha borrado un mensaje adjunto que no está en formato texto plano...
Nombre     : pycharm_warning.png
Tipo       : image/png
Tamaño     : 122218 bytes
Descripción: no disponible
Url        : <https://lists.es.python.org/pipermail/vigo/attachments/20201209/da6d0da2/attachment-0001.png>


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