V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
luhuan97
V2EX  ›  Python

9102 年了, Python3 首行还有必要加编码注释吗?

  •  1
     
  •   luhuan97 · 2019-07-12 10:15:56 +08:00 · 8882 次点击
    这是一个创建于 1952 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在帮日本写个项目,快结项了,他们要求全部 py 文件头加上:# -- coding: utf-8 -- 。。。。。。 我没解释,直接就苦逼慢慢改了。

    我理解他们对编码的严谨,但是都 python3 了,,,这有必要吗?我觉得是多余的。你们觉得呢?

    第 1 条附言  ·  2019-07-12 14:34:53 +08:00
    首先,谢谢每一个 V 友的回复。
    非常抱歉表达不够准确,我有必要学习一下字字斟酌朋友们。
    在发帖前我没有跟客户 BB,已经用我的方法按照客户要求修改好了,所以说“甲方要的需求就做,哪那么多废话”的朋友,。。。额,你们是对的。
    我“苦逼”那个词不是说这个需求的难度,而是我想表达使用 Python3 的项目还有必要加这个编码注释东西吗?是否多余?我开始接触 Python,他就告诉我怎么优雅的写代码。优雅之道是我所追求的。
    这个项目的生产环境无非就是 ubuntu 或 centos 的 python3。这个是从设计之初就已经确定的了。
    69 条回复    2019-07-13 15:49:14 +08:00
    congeec
        1
    congeec  
       2019-07-12 10:23:30 +08:00 via iPhone   ❤️ 7
    难道你是手动敲的?
    neroxps
        2
    neroxps  
       2019-07-12 10:25:38 +08:00
    编码严谨 711 不服
    newGamingLife
        3
    newGamingLife  
       2019-07-12 10:26:02 +08:00
    @congeec 就算是 copy 不也得一个个文件 copy 吗
    luhuan97
        4
    luhuan97  
    OP
       2019-07-12 10:27:59 +08:00
    @congeec 正常人都知道用 copy,但是文件很多啊,而且我心里是不平衡的,因为我认为是没必要的。
    janxin
        5
    janxin  
       2019-07-12 10:28:43 +08:00
    这个不是自动加就好了么...

    当然你不需要 Python2 上跑是没什么必要
    Jackxun123
        6
    Jackxun123  
       2019-07-12 10:29:37 +08:00
    。。和一楼相同的疑问
    luhuan97
        7
    luhuan97  
    OP
       2019-07-12 10:29:58 +08:00
    @janxin 就是要 python3 开发的,就算放 python2 也运行不了,毕竟不兼容。
    yvescheung
        8
    yvescheung  
       2019-07-12 10:30:27 +08:00
    有必要,因为我前几天就遇到过没加编码导致在另一台服务器上输出和注释全部乱码,你永远不知道自己的程序会被放在什么奇怪的环境下运行
    ctro15547
        9
    ctro15547  
       2019-07-12 10:30:32 +08:00   ❤️ 1
    用 py2 写个首行自动加的脚本不就得了(手动狗头)
    janxin
        10
    janxin  
       2019-07-12 10:30:44 +08:00
    @luhuan97 这不是有些坑逼会要求 py2/py3 兼容么...
    princelai
        11
    princelai  
       2019-07-12 10:30:46 +08:00 via Android
    自己写的从来不加,你这为别人写还是按要求吧
    lzvezr
        12
    lzvezr  
       2019-07-12 10:31:08 +08:00 via iPhone
    一楼的意思难道不是写个脚本自动加吗
    Jackxun123
        13
    Jackxun123  
       2019-07-12 10:31:47 +08:00
    我的话,用 sed 对某个文件夹下的所有.py 文件首行添加就行了,还可以加判断是否包含这句=。=
    咋说呢,人家是甲方,他爱咋搞咋搞=。=习惯就好了
    ant2017
        14
    ant2017  
       2019-07-12 10:32:19 +08:00 via Android
    一行命令直接加上的事
    luhuan97
        15
    luhuan97  
    OP
       2019-07-12 10:34:11 +08:00
    额,各位 v 友,其实我的问题重点在,有没有必要加,,,我知道可以自动加编码注释,我是故意取消的,我知道我在用的是 python3。不是加的难度,是有没有必要。
    ManjusakaL
        16
    ManjusakaL  
       2019-07-12 10:35:35 +08:00 via Android
    有必要啊,,你永远不知道你的代码会被放在什么环境下运行
    lihongjie0209
        17
    lihongjie0209  
       2019-07-12 10:35:48 +08:00
    @luhuan97 有没有必要是甲方决定的, 不是你决定的
    Vegetable
        18
    Vegetable  
       2019-07-12 10:39:17 +08:00
    没必要,爸爸说了之后,这就是个需求了,你觉得他们需求都有必要吗?
    lniwn
        19
    lniwn  
       2019-07-12 10:41:05 +08:00
    指定编码和不指定编码,源文件内容是两个不同的编码,这和 py2 或者 py3 没有什么关系。
    ipwx
        20
    ipwx  
       2019-07-12 10:42:08 +08:00
    对于我自己的项目,如果文件内部有非 ASCII 字符,我会加上。

    退一步考虑,就算 Python 3 解释器不关心它,有些编辑器或者 IDE 说不定也会关心它。

    加了又不会怀孕 😒
    tennc
        21
    tennc  
       2019-07-12 10:43:43 +08:00
    手敲的大佬 膜拜下~~
    py 写脚本 头部都是自动生成( ide )。。。。
    Hanggi
        22
    Hanggi  
       2019-07-12 10:49:41 +08:00
    9102 年是什么梗?只是单纯倒过来写显得都什么年代了?
    devcat
        23
    devcat  
       2019-07-12 10:51:45 +08:00   ❤️ 2
    2019 年了,还在用 9012 这种烂梗吗?
    BinRelay
        24
    BinRelay  
       2019-07-12 10:53:58 +08:00
    @devcat 没事 明年就没人用了
    Keyes
        25
    Keyes  
       2019-07-12 10:54:05 +08:00 via iPhone
    写好模版了,真心生命远离手打 233
    Trim21
        26
    Trim21  
       2019-07-12 10:55:10 +08:00 via Android   ❤️ 1
    @lniwn py3 默认 utf8 所以不指定跟指定 utf8 在 py3 下面是相同的
    ytmsdy
        27
    ytmsdy  
       2019-07-12 11:07:26 +08:00
    就算爸爸说每个文件里面要加一个雅美蝶,也要加啊!
    lniwn
        28
    lniwn  
       2019-07-12 11:07:31 +08:00   ❤️ 1
    @Trim21 #26 刚看了下,确实我记错了,py3 默认使用 utf8 解析源文件,py2 默认使用 ascii 解析源文件。
    https://docs.python.org/3/howto/unicode.html
    https://www.python.org/dev/peps/pep-0263/
    Davic1
        29
    Davic1  
       2019-07-12 11:08:57 +08:00
    问: 有什么影响?
    BinRelay
        30
    BinRelay  
       2019-07-12 11:20:00 +08:00
    我一直觉得加这个很不合理。
    注释就应该是注释,加与不加完全没有任何区别。不应该承担任何功能。
    cedoo22
        31
    cedoo22  
       2019-07-12 11:33:05 +08:00
    这个 直接再写一个 py,给加上不就行了??要怎么苦逼?不要堆代码。
    rocketman13
        32
    rocketman13  
       2019-07-12 11:42:37 +08:00
    画蛇要添足吗?
    lithiumii
        33
    lithiumii  
       2019-07-12 11:48:32 +08:00
    我一直是不加的,但是遇到过因为没加导致的报错
    Universe
        34
    Universe  
       2019-07-12 11:58:08 +08:00   ❤️ 8
    find . -name "*.py" | xargs grep -L '# -- coding: utf-8 --' | xargs sed -i '2 a# -- coding: utf-8 --'
    一行的事搞那么纠结干啥。。
    hahaayaoyaoyao
        35
    hahaayaoyaoyao  
       2019-07-12 12:06:33 +08:00 via Android
    @Universe 这个才是标准思路。
    pkookp8
        36
    pkookp8  
       2019-07-12 12:09:01 +08:00 via Android   ❤️ 2
    楼主只是描述了一个背景,对其中的事感到奇怪,超脱背景后讨论这件事奇不奇怪
    怎么这么多人说背景和怎么做这件事
    不管是脚本还是手动 copy 甚至手打,楼主应该是做完了才来问的
    对于这个奇怪的注释设定,我不知道,但我不加自己的脚本也能跑,没有细究过
    newtype0092
        37
    newtype0092  
       2019-07-12 12:12:36 +08:00
    @devcat 因为明年就用不了了啊。。。
    sikariba
        38
    sikariba  
       2019-07-12 12:36:13 +08:00
    既然明确说了是 py3 的项目,那我觉得没必要
    karllynn
        39
    karllynn  
       2019-07-12 12:41:45 +08:00
    py3 项目不需要加…

    用 sed 直接加上就行
    inframe
        40
    inframe  
       2019-07-12 12:43:30 +08:00 via Android
    pycharm 兴建文件时设置好模板就好
    luhuan97
        41
    luhuan97  
    OP
       2019-07-12 12:44:43 +08:00
    @Universe 我靠,这大佬,佩服。但是我改完才来发帖的。复制粘贴也没那么麻烦。 只是感觉没必要、多余而已。
    40huo
        42
    40huo  
       2019-07-12 12:48:15 +08:00 via Android
    拒绝 py2 的流毒,不加
    yingqi7
        43
    yingqi7  
       2019-07-12 12:57:36 +08:00 via iPhone
    @luhuan97 #15 废话,人家让加就加啊,有总比没有好不是吗
    youngxu
        44
    youngxu  
       2019-07-12 13:01:28 +08:00 via Android
    @luhuan97 这也不知道的话…你是怎么会写程序的?程序不就是为了帮人类解决简单重复的工作而发明的吗
    realcaoqi95
        45
    realcaoqi95  
       2019-07-12 13:05:01 +08:00
    编辑器自动加的...
    hhhsuan
        46
    hhhsuan  
       2019-07-12 13:25:20 +08:00 via Android
    一个 sed 全部搞定
    reus
        47
    reus  
       2019-07-12 13:59:08 +08:00
    和你用不用 python3 有什么关系?执行环境你又不能控制。
    这种事情要慎重考虑,“ 9102 ”年不是什么好的理由。
    reus
        48
    reus  
       2019-07-12 13:59:58 +08:00
    哎,没吃过亏的年轻人啊!
    reus
        49
    reus  
       2019-07-12 14:01:43 +08:00
    而且,什么叫“苦逼慢慢改”?你一个写程序的,就算你不会用 concat 命令,难道连写个脚本去改都不会吗?
    Torjan
        50
    Torjan  
       2019-07-12 14:06:09 +08:00
    @lniwn nice
    witcherhope
        51
    witcherhope  
       2019-07-12 14:15:36 +08:00 via iPhone
    9102 年,2020 看你怎么说
    laike9m
        52
    laike9m  
       2019-07-12 14:36:10 +08:00 via Android
    不论是公司还是个人项目都不加。。
    anonymous256
        53
    anonymous256  
       2019-07-12 14:44:38 +08:00 via Android
    既然是 py3 的项目,就可以不用写。 楼上有的人说执行环境的问题,py3 的解释器已经默认使是 utf-8。难不成你 py3 的代码,强行要在 py2 解释器运行?除非一开始就打算要兼容 py2 和 py3 两个版本。

    顺便吐槽一下,我同事也喜欢这么干(多此一举的事情),我用 with open 打开了项目中的文本,code review 的时候,同事让我用 try-except 去捕捉这个异常。这明明是一个不可能发生的异常(除非代码被人恶意做了手脚)。如果连这种异常都要去捕捉,那我每个 import 语句都要 try-except 了,因为理论上,我项目里的 py 文件和第三方库,还有可能被人偷了呢。 何必多此一举?
    zkqiang
        54
    zkqiang  
       2019-07-12 16:34:20 +08:00
    用 IDE 自动加就行了... 加就加呗,也不是什么难事


    另外我赞同 @anonymous256 吐槽的情况,有的人用 Python 这么灵动的语言,就是能写出笨重的代码出来...
    处处捕获异常,处处考虑兼容 3.5 之前的版本,以及大量重复代码堆积的属性和 getter setter
    diferent
        55
    diferent  
       2019-07-12 16:53:11 +08:00
    sed
    falcon05
        56
    falcon05  
       2019-07-12 17:04:49 +08:00 via iPhone
    手动 copy ……
    lihongjie0209
        57
    lihongjie0209  
       2019-07-12 17:06:54 +08:00
    @anonymous256 windows 下打开一个已打开的文件会报错, linux 下不会
    lihongjie0209
        58
    lihongjie0209  
       2019-07-12 17:07:48 +08:00
    如果甲方让你把所有的变量名,方法名都改为日文命名, 你也必须改. 因为对方是甲方
    mon6912640
        59
    mon6912640  
       2019-07-12 17:26:43 +08:00
    不用,py2 遗留的东西,因为这个编码问题才会用 py3 的
    fuxiuyin
        60
    fuxiuyin  
       2019-07-12 17:27:58 +08:00
    如果从使用的角度来讲,在一个自己未知的环境部署,还是有必要的。python3 文档里是"By default, Python source files are treated as encoded in UTF-8."注意一下 *default* ,如果程序部署在自己不掌握的环境,尤其是交给别人去部署,这种 *default* 就是不可信的,因为你永远无法知道他们的环境是怎么样的,python 设置呀什么的,甚至他们用的有可能是自己魔改后的 python 解析器。
    ClericPy
        61
    ClericPy  
       2019-07-12 17:42:34 +08:00
    以前一直以为 py3 不需要 shebang 上加编码的,结果有天发现报错了,复现原理是

    在 Windows 平台上
    如果一大串字符串里有从网页复制的非法字符时候, 会报错
    SyntaxError: Non-UTF-8 code starting with '\xe0' in file
    但是 shebang 带上# ! coding:utf-8 就不报错

    以前我在群里和人讨论过

    https://gist.githubusercontent.com/ClericPy/7ef32e1456df013dfd97cbd2b5835238/raw/932a69a10477408ef771a3dc3146611bee0eba04/test_python3_encoding_error.py


    可以试试去掉 shebang 那句
    lolizeppelin
        62
    lolizeppelin  
       2019-07-12 17:47:55 +08:00
    这玩意只有你代码文件里有相关字符串才需要啊...你代码文件里没有其他编码的当然不需要啊

    你引用的库也不会在每个文件里都带这个头啊(其实大部分库都没带头,因为人家都用英文),

    不过在东亚国家注释得写母语的话,233333
    129ykx733D016U2n
        63
    129ykx733D016U2n  
       2019-07-12 19:58:00 +08:00
    Python3 不是默认 utf8 吗?
    laqow
        64
    laqow  
       2019-07-12 20:05:27 +08:00 via Android
    日文编码比中文水还深,给日本供货编码细节注意一下还是合理的吧
    siteshen
        65
    siteshen  
       2019-07-13 01:12:38 +08:00
    一个肯定没问题的方案,一个可能有问题的方案,我倾向于选择前者。
    autogen
        66
    autogen  
       2019-07-13 01:24:28 +08:00
    没有加的习惯。。。
    ly931003
        67
    ly931003  
       2019-07-13 08:21:06 +08:00 via Android
    讲道理会编程检测一下首行让后自动加不就好了,反正 ascii 文件嘛
    qile1
        68
    qile1  
       2019-07-13 09:51:17 +08:00 via Android
    @ipwx 为啥我 Windows 10 系统,有时候编辑 py 文件没问题,但是过几天再用 utf 编码打开就乱码,用记事本打开在复制到文本编辑器里面保存会好,过几天又不行,html 和 js 文件也一样效果
    编辑器用的是 nd+
    ipwx
        69
    ipwx  
       2019-07-13 15:49:14 +08:00
    @qile1 不知道,我不用记事本或者 nd+。会不会是 BOM 问题?

    我一般用 Visual Studio Code 或者 PyCharm。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5515 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 06:45 · PVG 14:45 · LAX 22:45 · JFK 01:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.