2009-06-04 7 views
10

¿Cómo se accede explícitamente al nombre en el alcance integrado de Python?Acceso explícito al alcance integrado de Python

Una situación donde me encontré con esto fue en un módulo, digamos llamado foo, que por casualidad tenía una función abierta. En otro módulo, la función abierta de foo sería accesible como foo.open, que funciona bien. Sin embargo, en foo, bloques abiertos, el construido en abierto. ¿Cómo se puede acceder a la versión incorporada de un nombre como abrir explícitamente?

Soy consciente de que probablemente sea una mala idea bloquear cualquier nombre incorporado, pero todavía tengo curiosidad por saber si hay una forma de acceder explícitamente al alcance integrado.

+0

+1: Es una muy mala idea para anular los nombres incorporados. –

+0

Admito que estoy abriendo un tema antiguo, pero la pregunta me parece correcta. Explico: escribí una función para obtener acceso al archivo como lo hace 'open', tomando los mismos parámetros y devolviendo el mismo objeto, pero manejando casos en los que el archivo no se podía abrir en el formato deseado (generalmente de solo lectura). Solo accedería a él mediante algo como 'import my_scripts; f = my_scripts.open (nombre de archivo, modo) '. Como encuentro que el nombre 'my_scripts.open_' no es guapo, ¿sería eso malo, dado que el alcance está claramente dado? –

Respuesta

12

Uso __builtin__.

def open(): 
    pass 

import __builtin__ 

print open 
print __builtin__.open 

... le da ...

<function open at 0x011E8670>
<built-in function open>

+0

Punto de bonificación si alguien puede decirme cuándo se incluyó por primera vez en python. Los documentos normalmente son buenos para decir eso, pero no parece ser el caso aquí: http://docs.python.org/library/__builtin__.html – amjoconn

+2

Hace mucho, mucho tiempo, ya que puedes ver este hilo que data de 1992: http://www.python.org/search/hypermail/python-1992/0049.html (en aquel entonces se llamaba builtin en lugar de __builtin__). No me preocuparía que las versiones anteriores no lo admitan ;-) – ChristopheD

+0

Ahora que Python 3 está cerca, cambiaron __builtin__ al módulo interno regular: https://docs.python.org/3/library/builtins.html – Maciek

-2

Es algo así como

__builtins__.open() 
+2

__builtins__ es un detalle de implementación de CPython. Yo no confiaría en eso. –

+0

Es cierto ... Originalmente iba a sugerir __builtin__ pero olvidé que era un módulo: -/ –

Cuestiones relacionadas