Как можно получить дженерики в Python? Нечто подобное предлагает Java или C ++ - PullRequest
0 голосов
/ 11 июля 2019

Я работаю с дженериками в python и хочу знать, смогу ли я получить дженерики в python, как и другие языки.Синтаксис не должен быть таким же, как в других языках, но если я могу сделать что-то вроде


template<typename T>
class List {
public:
    T array[10];
};

int main() {
    List<int> list;
}

, я попробовал приведенный ниже код, но я не уверен, как мне добиться того же, что и в C ++ или Java.Например, мне нельзя разрешать добавлять объекты любого другого типа после определения типа данных при инициализации.


from typing import TypeVar, Generic, List

T = TypeVar('T')


class CircularQueue(Generic[T]):

    def __init__(self):
        self._front = 0
        self._rear = 0
        self._array = list()

    def mod(self, x): return (x+1) % (len(self._array)+1)

    @property
    def is_full(self):
        return self.mod(self._rear) == self.mod(self._front) + 1

    def insert(self, element: T):
        if not self.is_full:
            self._rear += 1
            self._array.append(element)


if __name__ == "__main__":
    # I want to Initialize the queue as cQueue = CircularQueue<int>()
    # Something that other compiled languauges offer
    # Is it possible to do so?
    # Or any other method so that I can restrict the type of objects.
    cQueue = CircularQueue()
    cQueue.insert(10)

    # Here I want to raise an error if I insert any other type of Object
    cQueue.insert('A')    


1 Ответ

1 голос
/ 11 июля 2019

В Python нет понятия обобщений, но можно сказать, что каждая функция является обобщенной, потому что параметры на самом деле не типизированы.Это подход типирование утки , когда все, что ходит как утка и крякает как утка, рассматривается как утка.Поэтому, как правило, «универсальные» функции будут только проверять, имеют ли параметры или объекты минимальный набор обязательных атрибутов, и соответствующим образом обрабатывают данные.

...