PEP8 y PyQt, ¿cómo conciliar la capitalización de la función?


Estoy empezando a usar PyQt en algunos proyectos y me estoy topando con un dilema estilístico. Las funciones de PyQt usan camel case, pero PEP8, que prefiero seguir, dice que use guiones bajos y todas las minúsculas para los nombres de funciones.

Así que, por un lado, puedo seguir PEP8, lo que significa que mi código tendrá llamadas de funciones mixtas a funciones camel case y underscore, e incluso mis clases tendrán nombres de funciones mixtos, ya que necesitaré sobrecargar funciones como mousePressEvent. O, puedo romper PEP8 y adoptar camel case para todos mis nombres de función en nombre de la consistencia.

Me doy cuenta de que esto es subjetivo y realmente es lo que personalmente prefiero, pero me gusta escuchar a otros sobre lo que hacen y por qué eligieron hacerlo de esa manera.

Author: Steven Vascellaro, 2010-09-05

5 answers

En su lugar, no lucharía contra su marco, al igual que, como principio general, no lucho contra el Ayuntamiento;-). Sucede que comparto su preferencia por los nombres de funciones en minúsculas con guiones bajos como especifica PEP 8, pero cuando estoy programando en un marco que obliga a un estilo de mayúsculas diferente, me resigno a adoptar ese estilo también, ya que no puedo convencer al marco de adoptar el estilo" mejor", y las inconsistencias de estilo (mezclas aleatorias de diferentes estilos) peor.

Por supuesto, algunos mixage es inevitable si está utilizando más de un framework... por ejemplo, PyQt con su camelcase, y funciones estándar de la biblioteca Python con sus minúsculas y guiones bajos!-). Pero dado que los frameworks como Qt a menudo están destinados a ser extendidos por subclases, mientras que la biblioteca Python estándar tiene menos aspectos de dicho diseño, en la mayoría de los casos donde el estilo de mayúsculas es forzado (porque necesita anular un método, por lo que no puede elegir un diferentes mayúsculas), será forzado a camelcase (por Qt), solo raramente a minúsculas (por la biblioteca estándar de Python). Por lo tanto, creo que adoptar el estilo Qt en este caso sigue siendo el mal menor.

 31
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-05 19:53:20

El documento pep8 dice qué hacer en este caso (énfasis mío):

Los nuevos módulos y paquetes (incluidos los frameworks de terceros) deben escribirse según estos estándares, pero cuando una biblioteca existente tiene un estilo diferente, se prefiere la consistencia interna.

 11
Author: Daenyth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-05 02:21:31

Usa lo que mejor se adapte.

Si está subclasificando clases Qt, o tiene una función muy integrada con ellas UseCamelCase.

De lo contrario, use_underscores.

 6
Author: Joe D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-01 07:47:07

Puedes usar guiones bajos si subclases esto. Y puede nombrar sus métodos con guiones bajos y PyQt4 podrá usarlos como si los hubiera nombrado 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)
 1
Author: Artur Gaspar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-05 01:26:36

Tal vez el uso sensato de módulos para separar los estilos en diferentes módulos puede ayudar. Al menos intente modularizar el código de estilo PEP8 básico para poseer el módulo de funciones auxiliares.

 0
Author: Tony Veijalainen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-05 21:50:06