首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python诉__setattr__ UnicodeEncodeError

Python诉__setattr__ UnicodeEncodeError
EN

Stack Overflow用户
提问于 2016-04-21 14:11:32
回答 2查看 933关注 0票数 2

我知道,当我们在对象之外时,我们必须使用setattr方法。但是,我在用unicode键调用setattr时遇到了问题,这导致我直接使用__setattr__

代码语言:javascript
复制
class MyObject(object):
    def __init__(self):
        self.__dict__["properties"] = dict()
    def __setattr__(self, k, v):
        self.properties[k] = v
obj = MyObject()

我得到了obj.properties的以下内容

  • setattr(obj, u"é", u"à"):提高UnicodeEncodeError
  • setattr(obj, "é", u"à"){'\xc3\xa9': u'\xe0'}
  • obj.__setattr__(u"é", u"à"){u'\xe9': u'\xe0'}

我不明白Python为什么有这些不同之处

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-21 14:30:43

Python 2.7?仅限Ascii标识符。这包括代码中的2) - ascii重音,但不包括.1) - unicode重音。

Unicode identifiers in Python?

3)涉及在字典中设置unicode键。合法的。

请注意,__setattr__几乎从来不像您所做的那样被使用。它旨在设置对象的属性。而不是截取它并将它们填充到内部dict属性中。我也避免将属性作为名称,在get/Set意义上与属性混淆。

通常,您希望使用setattr,而不是双下划线变量。不像你的开场白。

您通常也不调用double下划线方法,而是定义它们,Python的底层数据协议代表您调用它们。有点像JavaBeans get/set隐式调用(我认为)。

__setattr__可能很棘手。如果你不小心,它会以意想不到的方式阻止“设置活动”。

下面是一个愚蠢的例子,

代码语言:javascript
复制
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")

产出:

代码语言:javascript
复制
foo.KILOMETER:1000
foo.meter:unknown
foo.METER:unknown

您需要在else之后使用if

代码语言:javascript
复制
        else:
            self.__dict__[attrname] = value

产出:

代码语言:javascript
复制
foo.KILOMETER:1000
foo.meter:1
foo.METER:unknown

最后,如果您刚刚起步,而且unicode是个大问题,我将评估Python2vs3-3有更好的、统一的unicode支持。您可能需要或不需要使用2.7而不是3,这是有很多原因的,但是unicode“推动”了3。

票数 0
EN

Stack Overflow用户

发布于 2016-04-21 14:33:41

Python 2不允许unicode标识符:

代码语言:javascript
复制
>>> é = 3
  File "<stdin>", line 1
    é = 3
    ^
SyntaxError: invalid syntax

据推测,这一点是如此坚持,您无法在尝试时绕过它,因为setattr在调用__setattr__之前经历了一些处理。您可以通过在print的开头插入一个__setattr__来显示这一点:没有打印任何内容,所以这个问题不在您的代码中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36772235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档