Domanda

Modifica: da quando è stata posta questa domanda, sono state apportate molte migliorie alle librerie scientifiche standard di Python (che era l'area di destinazione). Ad esempio, il progetto intorpidito ha fatto un grande sforzo per migliorare le dotstring. Si può ancora discutere se sarebbe stato possibile affrontare questi problemi continuamente fin dall'inizio.


Ho questa domanda un po 'eretica: perché così tante librerie Python hanno un codice disordinato e non seguono le migliori pratiche standard? O pensi che questa osservazione non sia assolutamente vera? Come si confronta la situazione con altre lingue? Sono interessato alla tua opinione su questo.

Alcuni motivi per cui ho l'impressione che manchi la qualità:

  • I docstring spesso sono completamente mancanti o incompleti, anche per l'API pubblica. È doloroso quando un metodo accetta * args e ** kwargs ma non documenta quali valori possono essere forniti.

  • Pratiche di codifica Bad Python, come l'aggiunta di nuovi attributi al di fuori di __init__ . Cose come questa rendono il codice difficile da leggere (o da mantenere).

  • Quasi nessuna biblioteca segue le convenzioni di codifica PEP8. A volte le convenzioni non sono nemmeno coerenti in un singolo file.

  • Il design complessivo è disordinato, senza API chiare. Sembra che non sia stato effettuato un refactoring quasi sufficiente.

  • Scarsa copertura unittest.

Non fraintendetemi, Adoro Python e il suo ecosistema . E anche se ho lottato con queste librerie generalmente fanno il loro lavoro e ne sono grato . Ma penso anche che alla fine tonnellate di tempo per gli sviluppatori siano sprecate a causa di questi problemi. Forse perché Python ti dà così tanta libertà che è molto facile scrivere codice errato .

È stato utile?

Soluzione

Per quanto riguarda la documentazione, non è solo Python. Se esiste un solo fattore che impedisce l'adozione più ampia di OSS, IMHO è il livello veramente spaventoso di documentazione della maggior parte dei progetti OSS. Questo inizia a livello di codice e si estende ai documenti dell'utente. Posso solo dire a chiunque lavori su OSS:

a) Commenta il tuo codice! Non esiste un codice auto-documentante!

b) Spendere almeno il 25% del budget di tempo del progetto nella documentazione per l'utente finale.

E so vagamente di cosa sto parlando - ho un paio di progetti OSS per conto mio, ho contribuito a molti altri e uso l'OSS quasi esclusivamente. E ieri ho trascorso più di 4 ore a cercare di costruire un grande progetto OSS (senza nomi, senza trapano) e fallendo a causa della documentazione scadente e contraddittoria.

Altri suggerimenti

  

Invece gli autori sembrano seguire ciascuno la propria gloriosa convenzione. E a volte le convenzioni non sono nemmeno coerenti con lo stesso file di una libreria

Benvenuti nel meraviglioso codice del mondo reale!

Il codice FWIW Python che ho incontrato non è migliore o peggiore di quello in qualsiasi altra lingua.

(Beh, meglio del progetto PHP medio, ovviamente, ma non è proprio giusto.)

La prima cosa che devi capire è che Python non è nato, completamente formato, dalla testa di Guido qualche volta intorno alla versione 2.x. È cresciuto nel corso degli ultimi vent'anni.

In effetti, un certo numero di cose che menzioni (unittest, per esempio, e PEP-8), non esistevano nemmeno quando alcune delle librerie standard furono scritte per la prima volta.

Probabilmente noterai che più vecchia è la libreria che stai guardando, più è probabile che abbiano divergenze dalle attuali "migliori pratiche", spesso perché precedono l'adozione diffusa di tali pratiche. Le biblioteche più recenti hanno maggiori probabilità di conformarsi alle pratiche attuali.

Inoltre, a volte c'è spesso una buona ragione per non aggiornarli. Immagina di avere diverse decine di migliaia di righe di codice scritte contro le attuali librerie Python. Ora, il manutentore di una di quelle librerie decide di cambiare le librerie per rendere i nomi di classe e funzione conformi a PEP-8. Ora tutti coloro che hanno un codice funzionante devono rivisitarne enormi quantità, per non rinominare le cose.

Questo non vuol dire che non ci sono cose che possono migliorare nelle librerie di Python: ci sono! Ma c'è sempre un compromesso tra la perfezione e il fare le cose. Questa è una delle ragioni per cui dicono "La praticità batte la purezza". & Quot;

Questo perché Python non è supportato dal mondo aziendale come Java o .Net.

Se voglio che la mia libreria Java venga promossa da Sun seguirò le loro linee guida. Questo non è il caso di Python. Scrivo il mio codice, la gente lo trova meglio e deve evolversi da solo.

Anche la maggior parte degli sviluppatori Python provengono da C ++, C, Java, .Net ecc. E iniziano a scrivere codice di produzione fin dal primo giorno. Grazie alla facilità di Python. E il circolo vizioso continua.

Perfino mi ci è voluto un mese per venire a PEP8 e refactoring il mio codice.

PEP 8 è cambiato nel tempo. Alcuni moduli seguono raccomandazioni precedenti. Puoi vederlo con PIL, che utilizza moduli come " Immagine " dove il modulo contiene una singola classe principale, anziché la minuscola raccomandata per i nomi dei moduli, e nelle estensioni C che usano la "c" prefisso, piuttosto che il più moderno "quot" _ " prefisso.

Alcune delle librerie sono sviluppate da persone fortemente influenzate dalle tradizioni in altri campi, come Java e C ++. Queste persone usano più spesso CamelCase invece del PEP 8 raccomandato lowercase_with_underscores.

Le risposte qui non sarebbero complete senza riferimento a Legge sullo storione : " ; Il 90% di tutto è una schifezza. & Quot;

  

Il novanta percento di [librerie python] è rozzo, ma il novanta percento di tutto è rozzo

- Legge sugli storioni (parafrasata)

Sembra che tu abbia scoperto che la qualità del codice non soddisfa le aspettative che ti aspettavi. Forse da scuola, o libri di buone pratiche o sviluppatori senior.

Dopo aver lavorato in diverse aziende, mi sono trovato regolarmente consigliato di fare test unitari, codice documento, usare il controllo versione / sorgente (tutti i buoni consigli che ho preso) e poi scoprire che i donatori di quel consiglio raramente seguono i consigli stessi .

Direi che hai l'impressione giusta che a volte la qualità del codice sia bassa, ma solo in base alle tue aspettative. Certamente numpy e altri sono pacchetti abbastanza utili, anche se non codificati secondo lo standard che ci si aspettava.

Gli standard sono opinioni e, se si ritiene che gli standard siano bassi, si può provare a contribuire a migliorare tali standard contribuendo o accettarli così come sono e assicurarsi di scrivere codice che serva da esempio per i junior che ti troverai a capo di un giorno.

Per quanto riguarda matplotlib, esiste un progetto per migliorare la sua "quotazione" " - http://www.scipy.org/PyLab

Il vantaggio delle biblioteche scientifiche è che sono scritte da scienziati, no da sviluppatori di software professionali. Inoltre, quegli scienziati sono abituati a scrivere Fortran. La domanda è: preferiresti avere un codice funzionante o un bellissimo codice?

PEP8 è una guida allo stile , non un requisito di stile. Indica anche che dovresti "sapere quando essere incoerente". Personalmente, non mi piacciono alcune delle linee guida in esso. Preferisco camelCase a snake_case dato che ci sono più abituato.

E non guardo spesso al codice sorgente delle librerie che sto usando a meno che non sia assolutamente necessario (come il debug). Preferirei di gran lunga che la documentazione per detta biblioteca fosse abbastanza adeguata da non dover mai guardare la fonte.

Scherzi a parte, perché ti interessa davvero come appare il codice sorgente per matplotlib , purché faccia quello che dovrebbe fare?

Sono d'accordo con te sul docstrings mancante (supponendo che siano elementi pubblici piuttosto che interni) ma non è l'unico modo per documentare una biblioteca.

Credo che Python soffra di essere sollevato troppo avidamente su persone che non sono programmatori (a scuola o al commercio) come soluzione per "aver bisogno di un po 'di programmazione? Qui, prova questo strumento facile e maturo " ;.

Analogamente al modo in cui PHP è diventato un così grande successo e con così tante librerie con una qualità di codice abissale (anche se, garantito, la qualità media del codice Python è migliore di quella per PHP) - l'utente medio di PHP in modo simile all'utente medio di Python ha non molta esperienza di programmazione o abilità e pochissimi incentivi per migliorare se stessi in questo senso - hanno deciso di raggiungere qualcosa, e forse hanno pensato che fosse abbastanza degno da essere condivisi con la comunità sotto forma di biblioteca, ma molto spesso lavoro fatto non hanno interesse a migliorare il codice o migliorare se stessi (per quanto riguarda le capacità di programmazione, intendo).

La soluzione potrebbe essere che i repository di librerie Python (come PyPI) abbiano regole più rigide sull'accettazione dei pacchetti forniti - gestirlo con un processo di revisione il cui scopo è garantire la qualità - allo stesso modo in cui le principali distribuzioni Linux hanno un processo di revisione prima aggiungendo un pacchetto ai loro repository.

PEP8 è proprio questo, una convenzione, non un requisito. Sarebbe davvero triste se tutti i programmatori di python dovessero aderire a un insieme comune di regole, perdendo entusiasmo per il minimo dei problemi.

Per quanto riguarda gli argomenti mancanti - sì, possono essere d'aiuto quando si usa l'aiuto interattivo - ma in genere non mi dispiace finché c'è della documentazione . Cerco di non leggere il codice sorgente delle librerie che utilizzo, tendo a iniziare a modificarle (riscrivendole).

Per quanto riguarda il confronto con altre lingue, penso che il design del linguaggio abbia un ruolo importante qui. Ad esempio, in un linguaggio tipicamente forte come Java, anche se nella libreria manca una buona documentazione, è ancora possibile dedurre gran parte delle funzionalità dalle firme del metodo. Nessun * args con cui combattere.

Che ne dici di una raccolta di esempi di buoni documenti software?
Buoni esempi potrebbero portare a un miglioramento complessivo un po 'più veloce della camminata casuale.
La raccolta potrebbe essere suddivisa in categorie come:
inline doc / pagina di aiuto / tutorial / manuale di riferimento, pagina web / carta, immagini / nessuno.
Ogni voce dovrebbe contenere alcune parole sul perché il recensore lo trova valido.
(Dove: un angolo di StackOverflow?)

nikow: posso rispondere solo per me stesso, la maggior parte del mio lavoro su Python (e PHP o Ruby, tutti i linguaggi di scripting " dinamico) è fatto solo per me - ma lo rilascia sempre il mio sito personale se qualcun altro lo trova utile, ma non ho mai seguito alcuna documentazione o processo di controllo della qualità perché fintanto che funziona per me, sono felice.

Bene, sono open source. In quanto tali, si evolveranno anche nel tempo, se sono abbastanza buoni.

Questa è una delle tante bellezze dell'open source.

Spesso ha poco senso scrivere molta documentazione e "buono". codice se non sai se il progetto sopravviverà. Sarebbe solo una perdita di tempo.

Modifica: ovviamente scrivere un buon codice non farebbe mai del male alla prima volta ... Ma forse solo "fare il lavoro" è abbastanza buono in molti casi. Penso che altrimenti non ci piacerebbe la grande quantità di opzioni quando si tratta di OSS.

Penso che se un numero sufficiente di persone agisce in un modo specifico, potrebbe esserci qualche spiegazione. Non lo fanno casualmente per offenderti.

Qualità del codice * numero di commenti * tempo = costante

Scegli due!

Non ho mai avuto problemi con matplotlib; non posso dire di aver esaminato molto il codice: è una libreria eccellente. Fa quello che dovrebbe fare (gratuitamente!)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top