2009-06-04 12 views
10

Come si accede esplicitamente al nome in ambito di Python?Accesso esplicito allo scope di Python

Una situazione in cui mi sono imbattuto in questo era un modulo in, ad esempio chiamato foo, che è successo avere una funzione aperta. In un altro modulo la funzione aperta di foo sarebbe accessibile come foo.open che funziona bene. In foo stesso però, apre i blocchi di built-in aperto. Come puoi accedere alla versione integrata di un nome come apri esplicitamente?

Sono consapevole che probabilmente è praticamente una cattiva idea bloccare qualsiasi nome incorporato, ma sono comunque curioso di sapere se esiste un modo per accedere esplicitamente allo scope incorporato.

+0

+1: E 'una pessima idea per ignorare i nomi built-in. –

+0

Ammetto che sto aprendo un argomento ooold, ma la domanda mi sembra giusta. Spiego: Ho scritto una funzione per ottenere l'accesso al file proprio come fa 'open', prendendo gli stessi parametri e restituendo lo stesso oggetto, ma gestendo i casi in cui il file non poteva essere aperto nel desiderato (di solito in sola lettura). Vorrei accedervi solo con qualcosa come 'import my_scripts; f = my_scripts.open (filename, mode) '. Come trovo il nome 'my_scripts.open_' non è bello, sarebbe così male, dato che lo scopo è chiaramente dato? –

risposta

12

Usa __builtin__.

def open(): 
    pass 

import __builtin__ 

print open 
print __builtin__.open 

... ti dà ...

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

+0

Punto bonus se qualcuno può dirmi quando è stato incluso per la prima volta in python. I documenti sono normalmente bravi a dirlo, ma non sembra essere il caso qui: http://docs.python.org/library/__builtin__.html – amjoconn

+2

Un lungo, lungo tempo come puoi vedere questa discussione che risale a 1992: http://www.python.org/search/hypermail/python-1992/0049.html (allora era chiamato builtin invece di __builtin__). Non mi preoccuperei delle versioni precedenti che non lo supportano ;-) – ChristopheD

+0

Ora che Python 3 è in giro, hanno cambiato __builtin__ in un normale modulo builtin: https://docs.python.org/3/library/builtins.html – Maciek

-2

E 'qualcosa di simile

__builtins__.open() 
+2

__builtins__ è un dettaglio di implementazione di CPython. Non ci farei affidamento. –

+0

Vero ... Inizialmente avrei suggerito __builtin__ ma avevo dimenticato che si trattava di un modulo: -/ –

Problemi correlati