我刚刚使用在Python 3下运行Django App到使用Python 2.7。我现在得到这个错误:
SyntaxError: Non-ASCII character '\xe2' in file /Users/user/Documents/workspace/testpro/testpro/apps/common/models/vendor.py on line 9, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
它所引用的代码只是一个评论:
class Vendor(BaseModel):
"""
A company manages owns one of more stores.
"""
name = models.CharField(max_length=255)
def __unicode__(self):
return self.name
为什么?
这有效:
class Vendor(BaseModel):
"""
"""
name = models.CharField(max_length=255)
def __unicode__(self):
return self.name
答案 0 :(得分:9)
您的docstring中有一个UTF-8编码的U+200E LEFT-TO-RIGHT MARK:
'\n A company manages owns one of more stores.\xe2\x80\x8e\n '
从代码中删除该代码点(并尝试使用代码编辑器,而不是文字处理器),或者只将PEP-263编码注释放在文件的顶部:
# encoding=utf8
Python 3默认使用UTF-8,Python 2默认为ASCII源代码,除非您添加该注释。
答案 1 :(得分:0)
pointed out已Martijn Pieters,您的文档字符串包含UTF-8(即非ASCII)字符。
我想详细说明一下声明文件编码的正确方法。正如PEP 263中所述:
要定义源代码编码,必须将魔术注释放入 源文件作为文件的第一行或第二行,例如:
# coding=<encoding name>
或(使用流行的编辑器认可的格式):
#!/usr/bin/python # -*- coding: <encoding name> -*-
或:
#!/usr/bin/python # vim: set fileencoding=<encoding name> :
更准确地说,第一行或第二行必须与以下正则表达式匹配:
^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)
这意味着什么(如answer to another question中的概括):
因此,您可以在“编码”部分之前放置几乎所有内容,但是如果您希望100%兼容python-docs-recommendation-comm,则请坚持使用“编码”(无前缀)。
因此,对于这种情况,建议的“魔术评论”为:
# coding=utf8
或:
#!/usr/bin/python
# -*- coding: utf8 -*-
或:
#!/usr/bin/python
# vim: set fileencoding=utf8 :