Python setattr与_setattr _; UnicodeenCodeer错误
我知道当我们在对象之外时,我们必须使用Python setattr与_setattr _; UnicodeenCodeer错误,python,setattr,Python,Setattr,我知道当我们在对象之外时,我们必须使用setattr方法。但是,我在使用unicode键调用setattr时遇到问题,导致我直接使用\uuuu setattr\uuuu class MyObject(object): def __init__(self): self.__dict__["properties"] = dict() def __setattr__(self, k, v): self.properties[k] = v obj = My
setattr
方法。但是,我在使用unicode键调用setattr
时遇到问题,导致我直接使用\uuuu setattr\uuuu
class MyObject(object):
def __init__(self):
self.__dict__["properties"] = dict()
def __setattr__(self, k, v):
self.properties[k] = v
obj = MyObject()
我得到了obj.properties
的以下内容:
:引发UNICODEENCODEER错误setattr(obj,u“é”,u“á”)
:setattr(obj,“é”,u“a”)
{'\xc3\xa9':u'\xe0'}
obj.\uuuuu setattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
我不明白为什么Python会有这些差异Python2.7?仅限Ascii标识符。这包括使用2)-ascii重音而不是.1)-unicode重音的代码 3) 涉及在字典中设置unicode键。合法的 请注意_usetattr_uuu几乎从来没有像您现在这样使用过。这意味着要在对象上设置属性。不要截取它们并将它们填充到内部dict属性中。我也会避免将属性作为名称,将其与get/Set意义上的属性混淆 通常,您希望使用setattr,而不是双下划线变量。不像你的开场白 您通常也不调用双下划线方法,而是定义它们,Python的底层数据协议代表您调用它们。有点像JavaBeans获取/设置隐式调用(我认为) __setattr_u_;可能很棘手。如果您不小心,它会以意外的方式阻止“设置活动” 这里有一个愚蠢的例子
class Foo(object):
def __setattr__(self, attrname, value):
""" let's uppercase variables starting with k"""
if attrname.lower().startswith("k"):
self.__dict__[attrname.upper()] = value
foo = Foo()
foo.kilometer = 1000
foo.meter = 1
print "foo.KILOMETER:%s" % getattr(foo, "KILOMETER", "unknown")
print "foo.meter:%s" % getattr(foo, "meter", "unknown")
print "foo.METER:%s" % getattr(foo, "METER", "unknown")
输出:
foo.KILOMETER:1000
foo.meter:unknown
foo.METER:unknown
foo.KILOMETER:1000
foo.meter:1
foo.METER:unknown
在if
之后需要有一个else
:
else:
self.__dict__[attrname] = value
输出:
foo.KILOMETER:1000
foo.meter:unknown
foo.METER:unknown
foo.KILOMETER:1000
foo.meter:1
foo.METER:unknown
最后,如果您刚刚开始使用unicode,并且unicode是一件大事,那么我会评估Python2和3-3是否有更好的、统一的unicode支持。您可能需要或不需要使用2.7,而不是3,原因有很多,但unicode“向”3推进。Python2不允许使用unicode标识符:
>>> é = 3
File "<stdin>", line 1
é = 3
^
SyntaxError: invalid syntax
>>é=3
文件“”,第1行
é = 3
^
SyntaxError:无效语法
想必这一点是如此坚持,以至于您无法在尝试时解决它,因为
setattr
在调用\uuuuuu setattr\uuuu
之前要经过一些处理。您可以通过在\uuu setattr\uuuu
的最开始插入打印来显示这一点:没有打印任何内容,因此问题不在您的代码中。我使用的是Python 2.7.10(默认,2015年10月14日,16:09:02),在调用setattr
之前,我通过调用编码('utf-8')
最终解决了这个问题。否则,关于最后一点,我有以下要求:能够通过obj.properties[“toto”]
访问对象属性“toto”,也可以直接obj.toto
。因此,拦截setattr
和getattr
似乎是唯一的解决方案?toto
vsfoobar
泄露了这一点;-)如果您只需要通过obj.toto进行读取访问,则可以不使用setattr,而是编写一个返回obj.properties[attrname]的_getattr。重写_getattr_u是常见的,而_setattr_u是更特殊的情况,需要仔细考虑。我有一个类似我愚蠢的例子,其中有k个变量名,并测试属性名中的前导\uuu
,以允许正常的内部变量。