Python类型错误:'通用'对象不是可下标的 - 如何声明和实例化通用基类

问题描述:

我想在Python 3中利用新类型注释功能创建抽象通用基类,并支持泛型。Python类型错误:'通用'对象不是可下标的 - 如何声明和实例化通用基类

我有一个基类并将其定义为这样一个派生类:

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)你的类将继承'Generic [_T ]'。 – user2357112

+0

我确实有抽象方法,为了简洁,我省略了它们,因为它们不会影响问题。我想知道是否需要它,因为我看到通用类是ABC,所以我会删除它。 – Simon

这条线:

class FileReader(Generic(_T)): 

应该用括号内为Generic[_T]

class FileReader(Generic[_T]): 

Generic是通用的,像任何其他通用的ABC,你在括号中指定其类型参数。

+0

谢谢,我不敢相信我错过了,我一直盯着那个代码太久了。只要它能让我回答就会回答。 – Simon