В чем причина предоставления некоторых методов по умолчанию в глобальной области видимости в Python? - PullRequest
1 голос
/ 21 февраля 2009

В чем причина предоставления некоторых методов по умолчанию в глобальной области видимости, таких как функция len, вместо предоставления их на уровне экземпляра, например:

list.len()

вместо:

len (list)

Я считаю, что такие методы, как len, труднее обнаружить, чем методы экземпляра.

Есть ли причина этого?

Ответы [ 6 ]

6 голосов
/ 21 февраля 2009

Этот вопрос очень похож на этот . И ответы те же:

Поскольку Гвидо ван Россум, создатель Python, считает, что префиксная нотация в некоторых случаях более читабельна. Здесь - полный ответ. Я собираюсь процитировать некоторые части:

(a) Для некоторых операций префиксная нотация выглядит лучше, чем postfix - префиксные (и инфиксные!) операции имеют давнюю традицию математика, которая любит обозначения, где визуальные эффекты помогают математик думает о проблеме. Сравните легкость, с которой мы переписать формулу типа x * (a + b) в x a + x b до неуклюжести делать то же самое, используя необработанную запись ОО.

(b) Когда я читаю код, который говорит len (x), я знаю , что он запрашивает длина чего-то. Это говорит мне о двух вещах: результат целое число, а аргумент является своего рода контейнером. Иначе, когда я читаю x.len (), я уже должен знать, что х является своего рода контейнер, реализующий интерфейс или наследующий от класса, имеет стандартную длину (). Засвидетельствуйте беспорядок, который мы иногда имеем когда класс, который не реализует отображение, имеет get () или keys () метод, или что-то, что не является файлом, имеет метод write ().

Говоря то же самое по-другому, я вижу 'len' как встроенный работа . Я бы не хотел потерять это. Я не могу сказать точно ли ты имелось в виду это или нет, но 'def len (self): ...' конечно звучит как ты хочу понизить его до обычного метода. Я сильно -1 на этом.

4 голосов
/ 21 февраля 2009

Эта запись часто задаваемых вопросов может ответить на ваш вопрос:

4.7 Почему Python использует методы для некоторых функций (например, list.index ()) но функции для других (например, Len (список))

Основная причина - история. функции были использованы для тех операций, которые были общими для группы типов и которые были предназначены для работы даже для объекты, которые не имели методов в все (например, кортежи). Это также удобно иметь функцию, которая может легко наносится на аморфный коллекция объектов при использовании функциональные особенности Python (map (), apply () и др.).

Фактически, реализация len (), max (), min () как встроенная функция на самом деле меньше кода, чем реализация их как методы для каждого типа. Можно спорить об отдельных случаях, но это часть Python, и это слишком поздно, чтобы сделать такие фундаментальные изменения сейчас. Функции должны оставаться избежать массивной поломки кода.

Обратите внимание, что для строковых операций Python перешел от внешних функций ( строковый модуль) к методам. Тем не мение, len () по-прежнему является функцией.

Список всех этих функций (не слишком много) здесь, в документации .

2 голосов
/ 21 февраля 2009

Помимо ответа на часто задаваемые вопросы, предоставленного MrTopf, списки (и другие объекты) имеют метод длины __ len __ ()

Функция len () - это просто сокращение для вызова этого метода.

2 голосов
/ 21 февраля 2009

Как только вы изучите метод "len", вы знаете, что можете применить его к любой последовательности. Вам не нужно читать документ для каждой последовательности, с которой вы сталкиваетесь, чтобы узнать, есть ли у него метод len. Есть ожидание, что это так.

Встроенные функции обнаружить не сложнее, поскольку в документации python есть список встроенных методов. Вы можете выучить их всех за один раз с этой страницы вместо того, чтобы охотиться за ними по всему стилю библиотеки классов в стиле Java.

0 голосов
/ 21 февраля 2009

Они довольно обнаружимы:

>>> import __builtin__
>>> dir(__builtin__)
['ArithmeticError', 'AssertionError', ...
...

или лучше

>>> help(__builtin__)

Help on built-in module __builtin__:

NAME
    __builtin__ - Built-in functions, exceptions, and other objects.
...
0 голосов
/ 21 февраля 2009

Вы можете написать

re.match(r"\w+", "dog")

вместо

pattern = re.compile(r"\w+")
pattern.match("dog")  

Как вы заметили, иногда это не имеет смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...