2016-06-09 7 views
1

python 3의 새로운 유형 주석 기능과 generics 지원을 활용하여 Python으로 Abstract Generic Base 클래스를 만들려고합니다.Python TypeError : 'Generic'객체는 subscriptable이 아닙니다 - 일반 기본 클래스를 선언하고 인스턴스화하는 방법

나는 기본 클래스와 같은 정의 된 파생 클래스가 있습니다

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'를 설정하면 안됩니다. 3) Python 3에서 메타 클래스를 지정하는 문법을 변경했기 때문에 2) 추상 메소드가 없다. 3) 클래스가 'Generic [_T]의'typing.GenericMeta' 메타 클래스를 상속합니다. ]'. – user2357112

+0

나는 추상적 인 방법을 가지고있다. 나는 그들이 문제에 영향을 미치지 않았기 때문에 간략하게 생략했다. Generic 클래스가 ABC라는 것을 알았 기 때문에 제가 필요로하는지 궁금해서 제가 제거 할 것입니다. – Simon

답변

2

이 줄 :

class FileReader(Generic(_T)): 

Generic[_T] 위해 괄호를 사용한다 :

class FileReader(Generic[_T]): 

Generic 제네릭, 그리고 다른 일반적인 ABC처럼, 당신은 괄호 안에 해당 유형의 매개 변수를 지정합니다.

+0

고맙습니다. 나는 그 것을 놓쳤다는 것을 믿을 수 없어. 나는 그 코드를 너무 오래 꼼짝 않고 바라보고 있었다. 그것이 가능한 한 빨리 답변으로 표시됩니다. – Simon