Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python setattr与_setattr _; UnicodeenCodeer错误_Python_Setattr - Fatal编程技术网

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
的以下内容:

  • setattr(obj,u“é”,u“á”)
    :引发UNICODEENCODEER错误
  • 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
vs
foobar
泄露了这一点;-)如果您只需要通过obj.toto进行读取访问,则可以不使用setattr,而是编写一个返回obj.properties[attrname]的_getattr。重写_getattr_u是常见的,而_setattr_u是更特殊的情况,需要仔细考虑。我有一个类似我愚蠢的例子,其中有k个变量名,并测试属性名中的前导
\uuu
,以允许正常的内部变量。