2016-02-17 14 views
2

Python включает встроенную функцию max(). Однако, несмотря на то, что он встроен в него, это не ключевое слово. То есть, вам разрешено делать max=4. Это имеет смысл, так как максимум чего-то возникает. Но! Если вы используете max как переменную, тогда она отключает использование функции max в этой области.Использование максимальной функции Python при наличии переменной с именем max?

Так что, если вы:

max = 4 
max(1, 2) 

Вы получите ошибку int object not callable. Опять же, имеет смысл. Но есть ли способ указать, что вам нужна функция max? Как std.max()? Это касается и всех других встроенных функций.

+4

Не указывайте свои переменные после встроенных функций Python, период. – Will

+1

@ Вижу, я понимаю, что вы говорите, но с точки зрения удобочитаемости имена 'min' и' max' велики. Таким образом, есть моменты, когда вы можете создавать внутренние конфликты именования, чтобы ваш API был дружественным пользователю. –

+0

Было бы лучше использовать более описательное имя. Например, если у вас есть список под названием 'things', используйте' max_thing'. – Barmar

ответ

5

Модуль __builtin__ (Python 2)/builtins (Python 3) предоставляет еще один способ получить доступ ко всем встроенные/стандартные идентификаторы для случаев, как это:

>>> import __builtin__ 
>>> 
>>> __builtin__.max is max 
True 
>>> 
>>> max = 2 
>>> __builtin__.max([0, max]) 
2 
import __builtin__ as builtins 

def random_integer(min, max): 
    random_integer.seed = builtins.max(10101, (# looks random enough, right? 
     ((random_integer.seed * 3 - 210) % 9898989) >> 1)^173510713571) 
    return min + (random_integer.seed % (max - min + 1)) 

random_integer.seed = 123456789 

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

Изменение названия в Python 3 является частью the "core languages" changes described in PEP 3100:

Для того, чтобы избавиться от путаницы между __builtin__ и __builtins__, было решено переименовать __builtin__ (модуль) для builtins, и чтобы оставить __builtins__ (крюк песочницы) в одиночку.

+0

Название модуля изменено между Python 2 и Python 3? Интересно. –

+1

Тогда вы можете сделать '__builtins __. Max = 2' и действительно вызвать проблемы! – tdelaney