0

PEP263

要定义源代码编码,必须将魔术注释放在源文件中,作为文件的第一行或第二行,例如:

# coding=<encoding name>

或(使用流行编辑认可的格式):

#!/usr/bin/python
# -*- coding: <encoding name> -*-

如果在某些情况下许可信息出现在最顶层,例如来自https://github.com/google/seq2seq/blob/master/seq2seq/training/utils.py怎么办:

# Copyright 2017 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# -*- coding: utf-8 -*-
"""Miscellaneous training utility functions.
"""

Python解释器是否仍会“神奇地”接受编码定义?如果答案解释了为什么它必须在第一两行并且指向解释器代码的指针会很棒,那就太好了!

4

2 回答 2

1

是的,在 Python 2 中,UTF-8 编码需要该编码标记,如果它超出第二行,并且文件中有任何非 ASCII 字符,您将引发如下错误:

File "encoded.py", line 5
SyntaxError: Non-ASCII character '\xe1' in file encoded.py on line 5, but 
no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

如果文件只包含 ASCII 字符,它仍然可以工作,即使 UTF-8 编码标记晚于第 2 行。ASCII 是 UTF-8 的子集,基本上,后期编码指令被忽略。(这似乎是utils.py您引用的具体情况。)

许多解析器和其他文件处理器要求将此类魔术命令放在文件的开头,因为必须扫描并考虑它们才能正确解释文件。稍后再放它们,效率低下,需要扫描整个文件以找到一些“神奇”的特殊情况。

您将在 Python 3 中获得一些回旋余地,它采用 UTF-8 编码。尽管如果您的文件以其他方式编码,您仍然希望包含它。

于 2017-03-14T04:46:42.290 回答
1

该规范允许前行允许#!...在 unix 系统上使用 shebang。

不,第二行之后是不允许的。

这是来自 cpython 标记器的代码位,用于检查(并解析)编码 cookie:https ://github.com/python/cpython/blob/9e52c907b5511393ab7e44321e9521fe0967e34d/Parser/tokenizer.c#L613-L616

于 2017-03-14T04:56:31.323 回答