Переопределение [] для построения списков Python [duplicate]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

10
задан fferri 26 June 2015 в 14:59
поделиться

1 ответ

Это добросовестный выбор из Python.

Во-первых, что касается исправления встроенного типа, это, прежде всего, решение [] и только во второй раз оптимизация. Я узнал из многих скрытых в Python Mailing List, что исправление обезьян на встроенных типах, хотя и приятное для небольших скриптов, не служит никакой цели в чем-то большем.

Библиотеки, например, делают определенные предположения о типах. Если бы было предложено расширить типы по умолчанию, многие библиотеки в конечном итоге будут бороться друг с другом. Это также препятствовало бы созданию новых типов - deque - это deque, упорядоченный набор - упорядоченный набор, словарь - это словарь, и это должно быть.

Литеральный синтаксис особенно важный момент. Если вы не можете гарантировать, что [1, 2, 3] является списком, что вы можете гарантировать? Если люди могут изменить эти поведения, это будет иметь такое глобальное воздействие, чтобы разрушить стабильность большого количества кода. Существует причина goto , и глобальные переменные обескуражены.


Существует один конкретный взлом, который я am любит. Когда вы видите r"hello", это похоже на расширенную литеральную форму.

Так почему бы не r[1, 2, 3]?

class ListPrefixer:
    def __init__(self, typ):
        self.typ = typ

    def __getitem__(self, args):
        return self.typ(args)

class MyList(list):
    def each(self, func):
        return MyList(func(x) for x in self)

e = ListPrefixer(MyList)

e[1, 2, 3, 4].each(lambda x: x**2)
#>>> [1, 4, 9, 16]

Наконец, если вы действительно хотите сделайте глубокие хаки АСТ, проверьте MacroPy .

18
ответ дан Veedrac 18 August 2018 в 17:20
поделиться
  • 1
    +1 для "Если вы не можете гарантировать, что [1, 2, 3] является списком, что вы можете гарантировать? & Quot; И в отношении вашего примера: вы орехи! :) – Benjamin Hodgson♦ 29 September 2013 в 22:25
  • 2
    Отличное объяснение того, почему это «плохо», и отличное предложение об обходном пути! – SethMMorton 29 September 2013 в 22:26
  • 3
    Это отличный ответ. Вы разъяснили мне кое-что. То, что вы сказали о предположениях, сделанных библиотеками, имеет смысл. Полюбите свой пример (!), Хотя это обходной путь только для конкретного случая о списках ... Спасибо за ссылку для MacroPy, я обязательно посмотрю. – rboy 29 September 2013 в 22:57
Другие вопросы по тегам:

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