2017-07-17 2 views
1

Je veux utiliser classmethod pour retourner une nouvelle instance de la classe actuelle, et j'ai essayer un code comme ci-dessous, mais il élever un NameError ('nom « T » est pas défini)Comment faire pour que le vérificateur de type python sache qu'il devrait retourner une nouvelle instance de sa classe?

Mettez le code T = TypeVar('T', bound=A) sur class A ci-dessus ne fonctionne pas non plus.

Y a-t-il une bonne idée pour le gérer?

import json 
from typing import TypeVar 


class A(dict): 

    def __init__(self, name): 
     super(dict, self).__init__() 
     self["name"] = name 


    @classmethod 
    def foo(cls: T, args: str)->T: 
     return json.loads(args) 
T = TypeVar('T', bound=A) 


class B(A): 
    pass 

b = B(name='B') 
# True 
print(isinstance(b.foo(json.dumps(b)),B)) 

Répondre

2

Utilisez une chaîne pour faire une référence à l'avant et de donner Acls le bon type de Type[T]:

import json 
from typing import Type, TypeVar 


T = TypeVar('T', bound='A') 


class A(dict): 
    def __init__(self, name: str) -> None: 
     super().__init__(name=name) 

    @classmethod 
    def foo(cls: Type[T], args: str) -> T: 
     return cls(**json.loads(args)) 


class B(A): 
    def is_b(self) -> bool: 
     return True 


b = B.foo('{"name": "foo"}') 
print(b.is_b()) 
+0

Merci beaucoup. Cela fonctionne, mais je ne pouvais voir aucun indice sur pycharm. Cela ressemble à un bug de cet EDI parce que pycharm n'implémente pas complètement la norme pep484 [pycharm 2017.1.3]. – FavorMylikes