2010-09-05 19 views
31

Sto iniziando a utilizzare PyQt in alcuni progetti e mi sto imbattendo in un dilemma stilistico. Le funzioni di PyQt usano case cammello, ma PEP8, che preferisco seguire, dice di usare caratteri di sottolineatura e tutti in minuscolo per i nomi di funzioni. Quindi, da un lato, posso continuare a seguire PEP8, il che significa che il mio codice avrà funzioni miste chiamate a caso cammello e funzioni di sottolineatura, e anche le mie classi avranno nomi di funzioni misti, dato che dovrò sovraccaricare funzioni come mousePressEvent . Oppure, posso spezzare PEP8 e adottare il caso dei cammelli per tutti i nomi delle mie funzioni in nome della coerenza.PEP8 e PyQt, come riconciliare

Mi rendo conto che questo è soggettivo ed è proprio quello che preferisco personalmente, ma mi piace sentire dagli altri ciò che fanno e perché hanno scelto di farlo in quel modo.

+0

Sto solo iniziando con PyQt. Le funzioni sono l'unico problema o le variabili PyQt sono anche comunemente accessibili? Sto prendendo in considerazione l'utilizzo di camelCase per le funzioni nel mio codice UI PyQt, ma ancora seguendo le convenzioni PEP8 per i nomi delle variabili. Sono preoccupato che potrebbe creare un mix disordinato più tardi, però. –

+0

Comunque, non sono del tutto d'accordo che questo sia soggettivo. Apprezzo PyQt, ma penso che abbiano fatto un cattivo servizio non seguendo PEP8. (Inoltre, anche il nome della biblioteca non è molto pitonico._QtPy_ sarebbe stato di gran lunga migliore, dato che tutti gli sviluppatori di lingua inglese che ho incontrato, in due continenti, lo avrebbero pronunciato come "torta da buongustaio". ;-)) –

risposta

28

Nei tuoi panni, non vorrei combattere il tuo quadro, proprio come, come principio generale, non combatto City Hall ;-). Mi capita di condividere la tua preferenza per i nomi di caratteri minuscoli con underscore come specifica PEP 8, ma quando sto programmando in un framework che impone uno stile di capitalizzazione diverso, mi rassegno ad adottare anche quello stile, dal momento che non riesco a convincere il framework per adottare lo stile "migliore" e le incoerenze di stile (mix casuali di stili diversi) sono molto peggiori.

Naturalmente, alcuni mixage è inevitabile se si sta utilizzando più di un quadro ... per esempio, con la sua PyQt CamelCase, e funzioni della libreria standard di Python con le loro minuscole e underscore -!). Ma poiché i framework come Qt sono spesso destinati ad essere estesi per sottoclassi, mentre la libreria standard di Python ha meno aspetti di un tale progetto, nella maggior parte dei casi in cui lo stile di maiuscole è forzato (perché è necessario sovrascrivere un metodo, quindi non è possibile scegli una diversa maiuscola), sarà costretto a camelcase (da Qt), solo raramente a minuscolo (dalla libreria standard di Python). Quindi, penso che l'adozione dello stile Qt in questo caso sia ancora il male minore.

6

Utilizzare ciò che si adatta meglio.

Se si sottoclasse classi Qt o si ha una funzione fortemente integrata con loro UseCamelCase.

Altrimenti, use_underscores.

+10

Questo mostra esplicitamente ai lettori del codice cosa è collegato a Qt e cosa no. – EOL

+0

E in una buona applicazione, una quantità minima di codice utilizzerà comunque il toolkit GUI. – phkahler

0

Forse un uso ragionevole dei moduli per separare gli stili in diversi moduli può essere d'aiuto. Almeno prova a modulare il codice di stile PEP8 di base per possedere il modulo delle funzioni di supporto.

1

È possibile utilizzare caratteri di sottolineatura se si sottoclasse questo. E puoi dare un nome ai tuoi metodi con underscore e PyQt4 sarà in grado di usarli come se li avessi nominati con camelCase.

class SomeClass(object): 
    def __getattr__(self, attr): 
     if '_' in attr: 
      new = [c for c in attr] 
      while True: 
       try: 
        new_char = new[new.index('_') + 1].upper() 
        new[new.index('_'):new.index('_') + 2] = new_char 
       except (IndexError, ValueError): 
        break 
     else: 
      for c in attr: 
       if c.isupper(): 
        new = [] 
        for i, c in enumerate(attr): 
         if i != 0 and c.isupper(): 
          new.append('_') 
         new.append(c.lower()) 
        break 
     try: 
      return super(type(self), self).__getattribute__(''.join(new)) 
     except Exception: 
      return super(type(self), self).__getattribute__(attr) 
+6

Questo è un sacco di trucchi per ottenere al massimo un effetto cosmetico. –

11

Il documento PEP8 dice cosa fare in questo caso (sottolineatura mia):

Nuovi moduli e pacchetti (tra cui quadri di terzi) dovrebbe essere scritto a questi standard, ma dove una libreria esistente ha uno stile diverso, è preferibile la coerenza interna .