¿Están los métodos incorporados de python disponibles en un espacio de nombres alternativo en cualquier lugar?

¿Los métodos incorporados de python están disponibles para hacer referencia en algún paquete?

Dejame explicar. En mis primeros (ier) días de python hice un modelo de django similar a este:

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") 

Desde entonces he necesitado agregarle una propiedad. Esto me deja con este modelo:

 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) 

Así que ahora en tiempo de ejecución me sale el error: TypeError: 'ForeignKey' object is not callable . Esto está sucediendo porque ForeignKey para la propiedad ha reemplazado la propiedad del identificador incorporado. Lo que me gustaría poder hacer es, en lugar de @property usar @sys.property (o algo similar).

Nota: Ya conozco la solución al mover la propiedad de nombre sobre la statement del campo de propiedad. No estoy tan preocupado por este caso en particular, ya que soy la cuestión principal de ubicaciones alternativas para hacer referencia a las incorporaciones de python.

Use builtins , o __builtin__ si está en Python 2.

 def open(): pass import __builtin__ print open print __builtin__.open 

Esto te da:

   

Python tiene un módulo builtins donde se builtins las cosas “verdaderamente globales”, normalmente solo las funciones y tipos integrados estándar . En Python 2, se llamaba __builtin__ , pero funcionaba casi igual.

Este módulo se puede importar como cualquier otro módulo, pero también proporciona mágicamente los nombres incorporados para todos los demás módulos (que no los oculta).


Si te estás preguntando cómo funciona eso, los documentos builtins dicen:

Como detalle de implementación, la mayoría de los módulos tienen el nombre __builtins__ disponible como parte de sus globales. El valor de __builtins__ normalmente es este módulo o el valor del atributo __dict__ de este módulo. Dado que este es un detalle de implementación, no puede ser usado por implementaciones alternativas de Python.

Y el exec dice:

Si el diccionario __builtins__ no contiene un valor para la clave __builtins__ , se __builtins__ una referencia al diccionario de los módulos builtins en esa clave. De esa manera, puede controlar qué elementos incorporados están disponibles para el código ejecutado insertando su propio diccionario __builtins__ en globales antes de pasarlo a exec() .

Entonces, al menos en CPython, cuando evalúas los abs , los globals()['abs'] en globals()['abs'] , no se encuentran allí, y luego globals()['__builtins__'].__dict__['abs'] en globals()['__builtins__'].__dict__['abs'] .

Y cada vez que Python (o al menos CPython) crea un nuevo objeto de módulo, su código se ejecuta contra globals con un __builtins__ empty , lo que significa que el valor predeterminado del módulo builtins se completa, por lo que funciona. Y estos globals son los que se copian para la misma función y clase definida en el módulo (y todo lo que haga explícitamente con los globals sin reemplazar explícitamente a __builtins__ ), por lo que también funciona dentro de las funciones y clases.