2016-06-09 3 views
1

Я пытаюсь создать базовый базовый базовый класс в python, используя функциональность аннотаций нового типа в python 3 и поддержку дженериков.Python TypeError: объект «Generic» не подлежит расшифровке - как объявлять и запускать базовый базовый класс

У меня есть базовый класс и производный класс, определенный как таковой:

from abc import ABCMeta, abstractmethod 
from typing import TypeVar, Generic, Iterator, List, Dict, Optional 

_T = TypeVar('_T') 

class FileReader(Generic(_T)): 
    __metaclass__ = ABCMeta 
    def __init__(self, filename: str, verbose: bool = False): 
     pass 

_X = TypeVar('_X') 

class EmploymentHistoryFileReader(FileReader[_X]): 
    def __init__(self, filename: str, verbose: bool = False): 
     FileReader.__init__(filename=filename, verbose=verbose) 

И когда я пытаюсь создать экземпляр объекта типа EmploymentHistoryFileReader [EmploymentHistoryFileRow] я получаю:

File "/Users/simon.hughes/GitHub/analytics-py-careerpathing/careerpathing/data/employment_history_file_reader.py", line 38, in <module> 
class EmploymentHistoryFileReader(FileReader[_X]): 
TypeError: 'Generic' object is not subscriptable 

У меня есть пробовал много разных вещей, таких как указание значения для общего параметра при объявлении подкласса или при создании экземпляра подкласса, и все они приводят к тому же сообщению об ошибке. В основной библиотеке много примеров типичных типов, которые работают правильно, поэтому я смущен тем, почему я получаю эти ошибки.

+0

В дополнение к исправлению скобок вы не должны устанавливать '__metaclass__ = ABCMeta'. Это трижды неэффективно, потому что 1) они изменили синтаксис для указания метакласса в Python 3, 2), вы все равно не имеете абстрактных методов, и 3) ваш класс наследует метакласс «typing.GenericMeta» от «Generic [_T ] '. – user2357112

+0

У меня есть абстрактные методы, я опускал их для краткости, поскольку они не влияли на проблему. Мне было интересно, нужно ли мне это, хотя я видел, что класс Generic был ABC, поэтому я его удалю. – Simon

ответ

2

Эта линия:

class FileReader(Generic(_T)): 

должны использовать скобки для Generic[_T]:

class FileReader(Generic[_T]): 

Generic является общим, и, как и любой другой родовой ABC, необходимо указать его параметры типа в скобках.

+0

Спасибо, я не могу поверить, что пропустил это, я слишком долго смотрел на этот код. Отметьте как ответ, как только это позволит мне. – Simon

 Смежные вопросы

  • Нет связанных вопросов^_^