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

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


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/a846d025/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/a846d025/attachment-0001.png>


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