35

我开始在一些项目中使用 PyQt,但我遇到了文体困境。PyQt 的函数使用驼峰式大小写,但我更喜欢遵循的 PEP8 说函数名称使用下划线和全部小写。

所以一方面,我可以继续遵循 PEP8,这意味着我的代码将对驼峰式大小写和下划线函数进行混合函数调用,甚至我的类也会有混合函数名,因为我需要重载诸如 mousePressEvent 之类的函数. 或者,我可以打破 PEP8 并以一致性的名义对我所有的函数名采用驼峰式大小写。

我意识到这是主观的,这确实是我个人更喜欢的,但我喜欢听听其他人关于他们所做的事情以及他们为什么选择这样做的原因。

4

6 回答 6

33

在你看来,我不会反对你的框架,就像一般原则上,我不反对市政厅;-)。我碰巧分享了您对 PEP 8 指定的带有下划线的小写函数名称的偏好,但是当我在一个强制使用不同大写风格的框架中编程时,我也接受了这种风格,因为我无法说服框架采用“更好”的风格,风格不一致(不同风格的随意混合)真的更糟。

当然,如果你使用多个框架,一些混合是不可避免的……例如,PyQt 和它的驼峰,以及标准的 Python 库函数和它们的小写和下划线!-)。但是由于像 Qt 这样的框架通常旨在通过子类化来扩展,而标准 Python 库中这种设计的方面较少,在大多数情况下强制使用大写样式(因为您需要覆盖一个方法,所以您不能选择不同的大小写),它将被强制为驼峰式(由 Qt),很少变为小写(由标准 Python 库)。所以,我认为在这种情况下采用 Qt 风格仍然是较小的邪恶。

于 2010-09-05T19:53:20.083 回答
13

pep8 文档说明了在这种情况下该怎么做(强调我的):

新模块和包(包括第三方框架)应该按照这些标准编写,但是如果现有库具有不同的风格,则首选内部一致性。

于 2011-03-05T02:21:31.300 回答
6

使用最合适的。

如果你是 Qt 类的子类,或者有一个与它们高度集成的函数UseCamelCase

否则,use_underscores

于 2010-09-05T19:56:02.590 回答
5

2020 年 12 月,随着 Qt 6.0 的发布,Qt for Python 6 / PySide6(Qt 的官方 Python 绑定)也发布了,引入了一个名为__feature__. 使用此选项,您可以让 Qt 对象具有符合 PEP8 的蛇案例方法和真实属性。

老式:

table = QTableWidget()
table.setColumnCount(2)

button = QPushButton("Add")
button.setEnabled(False)

layout = QVBoxLayout()
layout.addWidget(table)
layout.addWidget(button)

新的 PySide6 样式:

from __feature__ import snake_case, true_property

table = QTableWidget()
table.column_count = 2

button = QPushButton("Add")
button.enabled = False

layout = QVBoxLayout()
layout.add_widget(table)
layout.add_widget(button)
于 2021-04-30T21:08:54.997 回答
1

You can use underscores if you subclass this. And you can name your methods with underscores and PyQt4 will be able to use them as if you have named them with 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)
于 2011-03-05T01:26:36.470 回答
0

也许明智地使用模块来分离不同模块中的样式会有所帮助。至少尝试将基本的 PEP8 样式代码模块化为自己的辅助函数模块。

于 2010-09-05T21:50:06.433 回答