正在加载今日诗词....
3 min read

Python 语法警告

Python 语法警告

语法的指导规则是 PEP 8

异常捕获太宽泛

too broad exception clause

当你使用 try: exception: 捕获异常时,最好明确指出这是哪种异常;

import logging


try: 
    pass
except Exception as e:
    logging.exception(e) 

如果确实要忽略这个问题, 在try: 前一行 添加 # noinspection PyBroadException

# noinspection PyBroadException
try: 
    pass
exception:
    pass

作用域内外变量名重名

下面书写就会出先警告Shadows name 'root_url' from outer scope


 def crawl(self, root_url):
        # 限制抓取的链接数
        count = 1
        self.urls.add_new_url(root_url)


# 在同一个文件中 调用此函数
root_url = 'www.baidu.com'
crawl(root_url)

解决办法:


 def crawl(self, root_url):
        # 限制抓取的链接数
        count = 1
        self.urls.add_new_url(root_url)


# 在同一个文件中 调用此函数, 不要使用同名变量,改用其他变量 url
url = 'www.baidu.com'
crawl(url)

Method xxx may be 'static'

方法可能是静态方法;
建议的愿意是,这个方法, 没有使用到self中的属性

class HtmlDownloader(object):

    @staticmethod
    def download(url):
        if url is None:
            return None

        res = urllib2.urlopen(url)
        if res.getcode() != 200:
            return None
        return res.read()

This dictionary creation could be rewritten as a dictionary literal.

字面量字典可能会被覆盖

dic = {}
dic['name'] = 'jack'

解决办法:

dic = dict()
dic['name'] = 'jack'

unexpected spaces around keyword / parameter equals

关键字参数和默认值参数的前后不要加空格

class_ 是关键字,在它附近的等号不要有空格

title_node = soup.find('dd', class_="lemmaWgt-lemmaTitle-title").find('h1')

blank line at end of file

文件最后多了一个空白行

python文本的最后只有一个空白行.

'ascii' codec can't encode characters in position

问题是 字符串编码异常
我们知道字符串有两种表示方式:

  • utf-8 字符串 也就是 str 类型
  • unicode 字符串

而对于编码则有

  • ascii
  • gbk

不同的字符串 对于编码的要求如下:

# 用 ascii 编码含中文的 unicode 字符串  
u.encode('ascii')  # 错误,因为中文无法用 ascii 字符集编码  
                   # UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)  
  
# 用 gbk 编码含中文的 unicode 字符串  
u.encode('gbk')  # 正确,因为 '关关雎鸠' 可以用中文 gbk 字符集表示  
                 # '\xb9\xd8\xb9\xd8\xf6\xc2\xf0\xaf'  
                 # 直接 print 上面的 str 会显示乱码,修改环境变量为 zh_CN.GBK 可以看到结果是对的  
  
# 用 ascii 解码 utf-8 字符串  
s.decode('ascii')  # 错误,中文 utf-8 字符无法用 ascii 解码  
                   # UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)  
  
# 用 gbk 解码 utf-8 字符串  
s.decode('gbk')  # 不出错,但是用 gbk 解码 utf-8 字符流的结果,显然只是乱码  
                 # u'\u934f\u51b2\u53e7\u95c6\u5ea8\u7b2d'  

以上摘自博客也谈 Python 的中文编码处理

所以对于中文编码如果出现上述问题,调整编码策略即可.