Дженерики/шаблоны в Python?

Как Python обрабатывает универсальные сценарии типа / шаблонные сценарии типа? Скажите, что я хочу создать внешний файл "BinaryTree.py" и иметь его, обрабатывают двоичные деревья, но для любого типа данных.

Таким образом, я мог передать его тип пользовательского объекта и иметь двоичное дерево того объекта. Как это сделано в Python?

62
задан 13 October 2014 в 09:34

3 ответа

Если Вы использующий Python 2 или хотите переписать код Java. Их не действительное решение для этого. Вот то, что я получаю работу ночью: https://github.com/FlorianSteenbuck/python-generics я все еще не получаю компилятора так Вы в настоящее время использование его как этот:

class A(GenericObject):
    def __init__(self, *args, **kwargs):
        GenericObject.__init__(self, [
            ['b',extends,int],
            ['a',extends,str],
            [0,extends,bool],
            ['T',extends,float]
        ], *args, **kwargs)

    def _init(self, c, a, b):
        print "success c="+str(c)+" a="+str(a)+" b="+str(b)

компилятор TODOs

  • Добирается, Универсальная работа Классов и Типов (Для вещей как <? extends List<Number>>)
  • Добавляют super, поддержка
  • Добавляет ? поддержка
  • , Код Моется
1
ответ дан 31 October 2019 в 14:14

На самом деле теперь можно использовать дженерики в Python 3.5 +. См. PEP-484 и документация библиотеки ввода .

Согласно моей практике это не является очень бесшовным и ясным специально для тех, кто знаком с Дженериками Java, но все еще применим.

17
ответ дан 31 October 2019 в 14:14

После придумывающий некоторые хорошие мысли о создании универсальных типов в Python, я начал искать других, у которых была та же идея, но я не мог найти никого. Так, здесь это. Я испытал это, и это работает хорошо. Это позволяет нам параметризовать наши типы в Python.

class List( type ):

    def __new__(type_ref, member_type):

        class List(list):

            def append(self, member):
                if not isinstance(member, member_type):
                    raise TypeError('Attempted to append a "{0}" to a "{1}" which only takes a "{2}"'.format(
                        type(member).__name__,
                        type(self).__name__,
                        member_type.__name__ 
                    ))

                    list.append(self, member)

        return List 

можно теперь получить типы из этого универсального типа.

class TestMember:
        pass

class TestList(List(TestMember)):

    def __init__(self):
        super().__init__()


test_list = TestList()
test_list.append(TestMember())
test_list.append('test') # This line will raise an exception

Это решение упрощенно, и оно действительно имеет, это - ограничения. Каждый раз, когда Вы создаете универсальный тип, он создаст новый тип. Таким образом несколько классов, наследовавшихся List( str ) как родитель, наследовались бы двум отдельным классам. Для преодоления этого необходимо создать dict, чтобы сохранить различные формы внутреннего класса и возвратить предыдущий созданный внутренний класс, вместо того, чтобы создать новый. Это предотвратило бы дублирующиеся типы с теми же параметрами от того, чтобы быть созданным. Если заинтересовано, более изящное решение может быть сделано с декораторами и/или метаклассами.

8
ответ дан 31 October 2019 в 14:14

Другие вопросы по тегам:

Похожие вопросы: