Доступны ли встроенные методы python в альтернативном пространстве имен? - PullRequest
6 голосов
/ 05 января 2011

Доступны ли встроенные методы python для ссылки в пакете где-нибудь?

Позвольте мне объяснить.В мои ранние (более поздние) времена Python я сделал модель django, похожую на эту:

class MyModel(models.Model):
    first_name = models.CharField(max_length=100, null=True, blank=True)
    last_name = models.CharField(max_length=100, null=True, blank=True)
    property = models.ForeignKey("Property")

Мне с тех пор нужно было добавить к ней свойство.Это оставляет меня с этой моделью:

class MyModel(models.Model):
    first_name = models.CharField(max_length=100, null=True, blank=True)
    last_name = models.CharField(max_length=100, null=True, blank=True)
    property = models.ForeignKey("Property")

    @property
    def name(self):
        return "{} {}".format(first_name, last_name)

Так что теперь во время выполнения я получаю ошибку: TypeError: 'ForeignKey' object is not callable.Это происходит потому, что свойство ForeignKey для свойства заменило свойство встроенного идентификатора.Я хотел бы иметь возможность вместо @property использовать @sys.property (или что-то подобное).

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

Ответы [ 2 ]

15 голосов
/ 05 января 2011

Используйте builtins или __builtin__, если вы используете Python 2.

def open():
    pass

import __builtin__

print open
print __builtin__.open

Это дает вам:

<function open at 0x011E8670>
<built-in function open>
1 голос
/ 02 апреля 2018

Python имеет модуль builtins, в котором хранятся «действительно глобальные» вещи - обычно просто стандартные встроенные функции и типы .В Python 2 он назывался __builtin__, но работал в основном так же.

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


Если вам интересно, как это работает, документы builtins говорят:

В качестве детали реализации большинство модулей имеют имя __builtins__ сделан доступным как часть их глобалов.Значение __builtins__ обычно является либо этим модулем, либо значением атрибута __dict__ этого модуля.Поскольку это деталь реализации, она не может использоваться альтернативными реализациями Python.

И exec говорит:

ЕслиСловарь globals не содержит значения для ключа __builtins__, ссылка на словарь встроенного модуля builtins вставлена ​​под этим ключом.Таким образом, вы можете контролировать, какие встроенные функции доступны для исполняемого кода, вставляя свой собственный словарь __builtins__ в глобальные переменные перед передачей его в exec().

Итак, по крайней мере в CPython, когда вы оцениваетеabs, он ищется в globals()['abs'], там не найден, а затем ищется в globals()['__builtins__'].__dict__['abs'].

И всякий раз, когда Python (или, по крайней мере, CPython) создает новый объект модуля, его код выполняетсяпротив globals с empty __builtins__, что означает, что значение модуля по умолчанию builtins заполняется, и это работает.И этот globals копируется для самой функции и класса, определенных в модуле (и всего, что вы делаете явно с globals без явной замены __builtins__), так что он работает и внутри функций и классов.

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