2015-11-01 9 views
8

Я хотел бы назначить другую функция LEN в __init__.py файле моего пакета следующим образом:Переопределения LEN в __init__.py - питон

llen = len 
len = lambda x: llen(x) - 1 

Он отлично работает, но только в файле __init__.py. Как я могу повлиять на другие модули в моем пакете?

ответ

2

При попытке загрузить имя, которое не определено как глобальный уровень модуля или функция локальная, Python ищет его в модуле __builtin__ (builtins в Python 3). В обеих версиях Python этот модуль также доступен как __builtins__ в глобальной области. Вы можете изменить этот модуль, и это повлияет не только на ваш код, но и на любой код Python в любом месте, который будет запущен после запуска вашего кода!

import __builtin__ as builtins # import builtins in python 3 
llen = len 
builtins.len = lambda a:llen(a) - 1 
+0

Спасибо! Работала отлично для меня :) – DorianOlympia

+1

** '__builtins__' - частная деталь реализации в CPython. ** Вы должны явно импортировать модуль' builtins' (или '__builtin__' в Python 2). – ppperry

4

Возможно, это не тот ответ, который вы ищете, но я бы не сделал этого, если бы был вами (и я уверен, что вы не можете легко, так или иначе).

Причина, по которой вам не следует, заключается в том, что python использует len внутренне на своих объектах для выполнения определенных операций. Другая причина - чистая сломанная логика. Определенная выше функция len вернет отрицательную длину для пустых списков или пустых вещей. Это кажется мне очень неприятным.

Что вы делаете может do, переопределяет метод длины только на определенных классах (это может иметь для вас большой смысл). Для этого вы можете использовать перегрузку операторов, просто переопределить метод __len__ в классе:

class MyList(object): 
    def __len__(self,): 
     # Do your thing 

Вы также можете посмотреть в мета-классы, есть очень хороший stack overflow вопрос по этому вопросу.

+0

Я согласен с тобой! Я знаю, что такое поведение на самом деле не подходит. Но этот код является частью моей домашней работы в университете. Я должен создать программу с очень раздражающим и трудно найти ошибку. Я думал, что назначение чего-то другого для простой и часто используемой функции (например, len) - хорошая идея! :) – DorianOlympia

 Смежные вопросы

  • Нет связанных вопросов^_^