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__。このオプションを使用すると、PEP8準拠のスネークケースメソッドとtrueプロパティを持つQtオブジェクトを作成できます。

古いスタイル:

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

これをサブクラス化する場合は、アンダースコアを使用できます。また、アンダースコアを使用してメソッドに名前を付けることができ、PyQt4は、キャメルケースを使用して名前を付けたかのようにメソッドを使用できます。

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 に答える