0

Wesley Chun のコア python アプリケーション プログラミング ブックの次のコードがあります。

#!/usr/bin/env python
"""
tcp server
"""

from socket import AF_INET, SOCK_STREAM, socket
from time import ctime

HOST = ''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)

tcp_server_socket = socket(AF_INET, SOCK_STREAM)
tcp_server_socket.bind(ADDR)
#maximum number of incoming connection before connection is refused
tcp_server_socket.listen(5)

while True:
    print "waiting for connection"
    tcpCliSock, addr = tcp_server_socket.accept()
    print "... connected from:" , addr

    while True:
        DATA = tcpCliSock.recv(BUFSIZE)
        if not DATA:
            break
        tcpCliSock.send('[%s] %s' % (ctime(), DATA))

    tcpCliSock.close()
tcp_server_socket.close()

元のコードにいくつかの変更を加えましたが、より準拠するように変更する最善の方法についてはまだ混乱しています

ここに私が受け取っているすべてのメッセージがあります

C: 14,0: Invalid name "tcp_server_socket" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C: 21,4: Invalid name "tcpCliSock" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
C: 21,16: Invalid name "addr" (should match (([A-Z_][A-Z0-9_]*)|(__.*__))$)
E: 25,15: Instance of '_socketobject' has no 'recv' member
E: 28,8: Instance of '_socketobject' has no 'send' member

最初の 3 つは、すべて大文字の変数名を使用することを望んでいるだけだと思います。これらのタイプのスクリプトの標準的な慣行は、この規則を使用してもコードが読みやすくなるとは思わないということです。逆に、読みにくくなります。 pylint のそのようなルールの背後にある動機と、コードをより準拠させる方法です。そのような身長のライターが、読みやすさ、初心者への優しさ、またはその他の理由で、理由もなくこのようなコードを書くとは思えません。

4

1 に答える 1

3

表示されている 2 つのエラーは、モジュールの動作_socketobjectの癖です。socketこの問題は以前に StackOverflowで発生しており、リンクされた質問は、これらのエラーを取り除くのに役立ついくつかの回答を提供します。

表示される最初の 3 つのメッセージは、規則に関する警告です。彼らは、名前が定数メンバーの正規表現と一致しないと不平を言ってtcp_server_sockettcpCliSockますaddr。コードは「トップレベル」(つまり、関数やクラスの外側) にあるため、メンバーは定数であることが期待され、定数の名前は与えられた正規表現と一致する必要があります。

Python スクリプトがファイルに保存されているとしますtcp_server.pyimport tcp_serverその後、Python インタープリターまたは別の Python スクリプトから書き込むと、TCP サーバーが起動します。これは通常、発生したいことではありません。モジュールの場合import、関数、クラス、および定数を定義できますが、コードを実行するべきではありません。

すべてのコードを行からtcp_server_socket = socket(....)下に向かって別の関数に移動し (これを と呼びましょうstart_server)、スクリプトの最後に次の行を追加することをお勧めします。

if __name__ == "__main__":
    start_server()

これらの 2 行は、スクリプトを直接実行した場合はサーバーを起動しますが、import tcp_server他の場所から実行した場合は起動しません。

これが完了すると、変数名に関する警告は表示されなくなりますが、さらに規約に関する警告が表示されます。そのうちの 2 つは、変数名の命名規則に一致しないと文句を言い、もう 1 つは、DATA関数にdocstring がないことをしつこく言います。tcpCliSockstart_server

于 2012-09-09T08:36:19.993 に答える