La conversione / fusione di un booleano in int è una buona idea? [chiuso]

0

Nota: Anche se questo contiene Python, non è specificamente su Python. È più in generale riguardo l'aspettarsi un certo comportamento da una lingua che non è necessariamente la stessa tra compilatori / interpreti.

Quindi ho trovato questa domanda:

How do I convert a boolean to int in Python? Can I just do int(mybool)?

La mia risposta è stata scrivere:

1 if mybool else 0

Il mio ragionamento era che il "casting" cieco su int si basava sull'implementazione interna del compilatore / interprete. E chi lo sa, se l'esecuzione di un interprete diverso int(mybool) potrebbe restituire qualcos'altro. Dichiarare esplicitamente il valore per un valore "verità" e per un valore "falso" produrrà sempre il comportamento previsto.

Questo è sicuramente qualcosa che si può prendere in considerazione per la maggior parte delle lingue.

Sono troppo esigente per questo? So di aver scritto int(mybool) me stesso in passato. E quella domanda mi ha fatto pensare: era ok? Dato che questo è un caso molto comune, i compilatori / interpreti sono abbastanza intelligenti da "fare la cosa giusta" per bool - > conversioni int?

Ora, per il caso speciale per i linguaggi di dattilografia come Python, int(mybool) potrebbe certamente essere una pessima idea, ma altre lingue sono un po 'più chiare sulla loro digitazione.

    
posta exhuma 06.05.2014 - 16:25
fonte

3 risposte

10

Con altre lingue la situazione non è chiara, ma python sembra essere specificato in un modo in cui si può dipendere dal casting sempre su 1 e 0. I designer di Python sono tra i migliori in merito al principio del minimo stupore.

Il problema è che Python è relativamente raro come prima lingua e i programmatori trasferiscono pratiche da altri linguaggi che diventano superstizioni nella nuova lingua. Se la loro prima lingua fosse il C ++, saranno molto nervosi nel lanciare un booleano invece di usare un ramo, specialmente se Python è più un linguaggio hobbistico per loro che qualcosa che usano in profondità.

Il codice è destinato agli esseri umani a leggere più dei computer. Spesso è meno problematico utilizzare un costrutto che funzioni in modo affidabile attraverso i linguaggi di programmazione piuttosto che dipendere da una conoscenza approfondita delle specifiche di una lingua o dalla creazione di un commento a tale effetto. È la stessa ragione per cui utilizziamo le parentesi nei casi in cui la precedenza degli operatori potrebbe essere diversa tra le lingue. È meno difficile leggere per i programmatori multilingue.

Questo non significa che non dovremmo provare a scrivere codice idiomatico, ma tieni a mente i tuoi manutentori quando lo faranno entrambi i metodi.

    
risposta data 06.05.2014 - 17:06
fonte
7

Il titolo della tua domanda chiede "è una buona idea" ma il corpo chiede "qual è il modo corretto di farlo?" Tratterò la preoccupazione nel titolo.

Essenzialmente, un booleano è semplicemente un singolo bit. Tuttavia, rappresenta la verità, non un numero: mentre un bit può rappresentare zero o uno, rappresenta vero e falso quando quel bit è un booleano. Cosa significa "vero" nel contesto di un numero? Ha senso quanto gettare il colore "rosso" su un numero.

Per questo motivo, sostengo che è non una buona idea convertire o eseguire il cast di un booleano in un numero intero o in un altro tipo. Ciò distrugge il vero / falso significato del booleano.

Java tende a essere un capro espiatorio per l'implementazione di decisioni idiomatiche sul linguaggio, ma credo fermamente che una cosa che hanno ragione sia di fare il modo di trattare i booleani come qualcosa di diverso da un intero. In Java, non è possibile eseguire il cast booleano come numero intero o qualsiasi altro tipo per gli stessi motivi che ho già delineato.

Sulla base della discussione nei commenti, ho bisogno di affrontare il quadro più ampio del perché questo è il caso. Un cast funziona per una relazione is-a e deve essere non ambiguo.

è-a : sarebbe possibile convertire un string in list ? No, non esiste alcuna relazione is-a tra di loro. Sarebbe possibile convertire una stringa in un elenco, ad es. esprimendolo come una lista di personaggi. La cast dovrebbe essere usata per prendere un oggetto e usarlo come un tipo più specifico: ad es. lanciare un Shape a un Square . Il casting su Color non ha senso: ma recuperare l'attributo color della forma ha ha senso.

unambiguous : un cast non deve avere alcuna ambiguità su come eseguire una conversione. Fondare una stringa su un numero intero non ha senso, perché sono necessarie informazioni aggiuntive: quale radix dovrebbe essere usato per eseguire la conversione? Se si converte una data in un numero intero, il cast dovrebbe ottenere il numero di secondi dall'epoca? L'ora del giorno? L'anno? Un cast semplice non possiede e non può avere questa conoscenza: è necessaria una funzione di conversione.

    
risposta data 06.05.2014 - 17:51
fonte
1

Anche se penso che sia generalmente meglio usare il linguaggio condizionale per la conversione indipendentemente da ciò che rappresenta la variabile booleana, vale la pena notare che le variabili booleane possono essere usate in due modi semanticamente distinti, e il modo preferito di scrivere il codice è diverso per ciascuno.

Sebbene alcune persone suggeriscano che someCondition == true o someCondition == false dovrebbero sempre essere considerati ridondanti e sostituiti con someCondition e !someCondition , suggerirei che i due tipi di espressioni siano considerati con significati leggermente diversi e implicazioni. Entrambi genereranno un identico codice macchina e nella maggior parte dei casi sarebbe preferibile quest'ultimo, ma il primo interpreterebbe someCondition come un "valore" astratto piuttosto che una dichiarazione sulla verità o la falsità. Ad esempio, se uno sta scrivendo il codice di sistema incorporato e gli strumenti di sviluppo forniscono un metodo bool portState(pinNumber) , scrivere buttonPressed = (portState(BUTTON_PORT) == false); potrebbe essere migliore di buttonPressed = !portState(BUTTON_PORT); . Interpreterò il primo come "Il pulsante viene premuto quando il pin I / O è un livello logico basso"; Non sono sicuro di come avrei dovuto vocalizzare quest'ultimo.

    
risposta data 06.05.2014 - 22:06
fonte

Leggi altre domande sui tag