Perché il metodo _replace delle classi namedtuple Python è protetto?

6

Nella sezione Variabili dei nomi e delle varianti di metodo , la Python Style Guide (aka PEP 0008) dice: "Usa un trattino basso solo per metodi non pubblici e variabili di istanza". Perché allora il metodo _replace su namedtuple ha un trattino basso principale? namedtuple stesse classi non invocano affatto _replace e nel frattempo l'esistenza di _replace è pubblicizzata nella docstring per namedtuple() (si veda qui , ad esempio).

    
posta kuzzooroo 11.04.2016 - 05:24
fonte

2 risposte

5

namedtuple è una cosa un po 'insolita in Python. Non è una classe base, è un generatore di classi. Invocandolo crea una nuova classe che usa una tupla per la sua memoria e può essere manipolata come una tupla o una normale classe con campi denominati.

La classe generata è pensata per essere usata come base per i tuoi tipi che aggiungerà metodi e vincoli. Compresi i vincoli che legano insieme i valori dei singoli campi.

Quindi il namedtuple potrebbe essere usato come base per le classi che non supportano la sostituzione. E poiché la classe derivata non può rimuovere i metodi forniti dalla sua base, il metodo non deve essere pubblico.

Tuttavia alcune classi derivate potrebbero desiderare questa funzionalità. Quindi è fornito, come metodo interno. La sottoclasse può esportarla se ne ha un buon uso.

    
risposta data 11.04.2016 - 07:24
fonte
4

Nella namedtuple documentazione , si dice:

Any valid Python identifier may be used for a fieldname except for names starting with an underscore. Valid identifiers consist of letters, digits, and underscores but do not start with a digit or underscore and cannot be a keyword such as class, for, return, global, pass, print, or raise.

Perché namedtuple s ha una struttura di campo dinamica. Fornisci un elenco di identificatori e crea una classe con field s correlato.

Poiché ha un tipo di campo dinamico, gli sviluppatori cercano di evitare quante più condizioni possibili per rendere field_names flessibile. Hanno chiamato i metodi della classe base con un trattino basso, ( _make() , _replace() , _asdict() e _fields ) in modo da poter utilizzare nomi non sottolineati per i nomi dei campi o simili.

Nessun identificatore può iniziare con una cifra e nessun metodo di classe o proprietà o campo può avere il nome di una keyword in python come regola generale. Per quanto riguarda l'ultima regola di denominazione namedtuple field_name , i nomi che iniziano con un carattere di sottolineatura non sono disponibili poiché sono riservati per i nomi di metodi e proprietà della classe namedtuple .

    
risposta data 11.04.2016 - 08:22
fonte

Leggi altre domande sui tag