Come e perché abbiamo caratteri di sottolineatura nella denominazione delle variabili

1

Se guardo nel codice Python e talvolta anche nei codici C, ci sono spesso due variabili con lo stesso nome, ad eccezione del carattere di sottolineatura. Ad esempio due variabili

variable1 data;
variable2 _data;

Perché è così e qual è lo sfondo?

    
posta Niklas Rosencrantz 05.05.2017 - 18:57
fonte

3 risposte

3

In generale è quello di evitare uno scontro di nomi. Hai una variabile e ne hai bisogno un'altra che è una diversa incarnazione, possibilmente in un dominio diverso, ma richiede lo stesso nome.

Come, una variabile a livello di applicazione e una variabile a livello di sistema. O una proprietà pubblica e la sua variabile interna.

    
risposta data 05.05.2017 - 22:46
fonte
1

In generale ...

Per il caso di due nomi di variabili che differiscono solo per un trattino basso, penso che la risposta si riduca a "il programmatore pensava che rendesse il codice più leggibile". Se in realtà rende il codice più leggibile può essere discutibile, ma a volte può avere senso per le variabili strettamente accoppiate.

Ad esempio, potresti avere una funzione che accetta un argomento per cui applichi qualche piccola trasformazione prima di procedere. Ad eccezione della trasformazione, le variabili conterranno informazioni identiche.

Ad esempio:

def some_function(foobar):
    _foobar = foobar.lower()
    if _foobar == "whatever":
        ...

Se dovessi darti una regola empirica su come interpretarlo, direi che è probabilmente sicuro assumere che la variabile con un carattere di sottolineatura contenga dati leggermente diversi dal valore "reale".

Se la tua domanda riguarda specificamente il motivo per cui qualcuno userebbe un carattere di sottolineatura principale in python, PEP8 contiene gli standard ufficiali di denominazione. Inclusi in quegli standard di denominazione sono le regole per i caratteri di sottolineatura iniziali e finali.

    
risposta data 05.05.2017 - 21:10
fonte
0

Non posso parlare con Python.

Nel caso di C, gli identificatori con trattini bassi iniziali sono supposti da riservare per l'uso dall'implementazione:

7.1.3 Reserved identifiers

1     Each header declares or defines all identifiers listed in its associated subclause, and optionally declares or defines identifiers listed in its associated future library directions subclause and identifiers which are always reserved either for any use or for use as file scope identifiers.

      — All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.

      — All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.

      — Each macro name in any of the following subclauses (including the future library directions) is reserved for use as specified if any of its associated headers is included; unless explicitly stated otherwise (see 7.1.4).

      — All identifiers with external linkage in any of the following subclauses (including the future library directions) and errno are always reserved for use as identifiers with external linkage.184)

      — Each identifier with file scope listed in any of the following subclauses (including the future library directions) is reserved for use as a macro name and as an identifier with file scope in the same name space if any of its associated headers is included.

2     No other identifiers are reserved. If the program declares or defines an identifier in a context in which it is reserved (other than as allowed by 7.1.4), or defines a reserved identifier as a macro name, the behavior is undefined.

Bozza online C 2011 (N1570)

IOW, se scrivi un codice C, non dovresti usare i trattini bassi di sottolineatura per i tuoi identificatori (nomi di variabili, nomi di funzioni e struct , union e enum tag nomi); se lo fai, corri un leggero rischio di collisione di un nome con un identificatore utilizzato dall'implementazione durante la traduzione. Ad esempio, se si definisce una funzione denominata _write , ciò potrebbe entrare in conflitto con una funzione predefinita _write utilizzata dall'implementazione printf nella libreria standard.

Poiché il comportamento sul dichiarare o utilizzare un identificatore riservato è indefinito , il compilatore non è obbligato a rilasciare alcuna diagnostica; non saprai che c'è un problema (se ce n'è uno) fino al runtime, e quel problema potrebbe essere abbastanza sottile e difficile da diagnosticare. I compilatori con cui ho familiarità non pubblicheranno alcuna diagnostica o non riescono a tradurre il codice.

Nota che non c'è nulla di magico nel carattere di sottolineatura stesso: è solo un altro carattere che puoi usare in un identificatore. L'unica vera differenza tra _data e data è che sono nomi distinti; il carattere di sottolineatura non aggiunge alcun significato oltre a questo. Ancora, l' intento è che i nomi con underscore principali sono riservati per l'implementazione, ma il compilatore in genere non impone questo durante la traduzione.

    
risposta data 08.05.2017 - 18:11
fonte

Leggi altre domande sui tag