我有以下来自wesley chun core python application programming book
的代码#!/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
我想前三个只是希望我使用所有大写变量名称,这是这些类型脚本的标准做法,我没有看到使用这个约定使代码变得更具可读性,相反它看起来会更少可读性,这种规则在pylint背后的动机是什么以及如何使代码更加合规,我几乎不认为这种身材的作家会毫无理由地编写这样的代码,无论是可读性,初学友好性还是其他任何东西。
答案 0 :(得分:3)
您看到的关于_socketobject
的两个错误是socket
模块如何工作的怪癖。此问题有come up on StackOverflow once before,相关问题提供了几个答案,可帮助您摆脱这些错误。
您收到的前三条消息是常规警告。他们抱怨名称tcp_server_socket
,tcpCliSock
和addr
与常规成员的正则表达式不匹配。因为您的代码位于“顶级”(即在任何函数或类之外),所以成员应该是常量,并且常量的名称应该与给定的正则表达式匹配。
假设您的Python脚本已保存在文件tcp_server.py
中。如果您从Python解释器或其他Python脚本编写import tcp_server
,则TCP服务器将启动。这通常不是您想要发生的。如果你import
一个模块,它可以定义函数,类和常量,但它不应该运行任何代码。
我建议将行tcp_server_socket = socket(....)
中的所有代码向下移动到一个单独的函数中(让我们称之为start_server
),然后在脚本底部添加以下行:
if __name__ == "__main__":
start_server()
如果您直接运行脚本,这两行将启动您的服务器,但如果您import tcp_server
来自其他地方则不会。
完成后,有关变量名称的警告将会出现,但您会收到一些常规警告。其中两个会抱怨DATA
和tcpCliSock
与变量名称的命名约定不匹配,另一个会抱怨你的start_server
函数没有文档字符串。