如何使用关键字作为变量名?

发布于 2021-01-29 18:59:59

我有以下带有变量的类fromtoratefrom是一个关键字。如果要在下面的init方法中使用它,编写它的正确方法是什么?

更多上下文:该类from明确需要该变量,因为它是另一个开发人员用另一种语言编写的POST端点所需的json的一部分。因此,更改变量名称是不可能的。

class ExchangeRates(JsonAware):
    def __init__(self, from, to, rate):
        self.from = from
        self.to = to
        self.rate = rate

JsonAware代码:

class PropertyEquality(object):
    def __eq__(self, other):
        return (isinstance(other, self.__class__) and self.__dict__ == other.__dict__)

    def __ne__(self, other):
        return not self.__eq__(other)

    def __repr__(self):
        return '%s(%s)' % (self.__class__.__name__, ', '.join(['%s=%s' % (k, v) for (k, v) in self.__dict__.items()]))

class JsonAware(PropertyEquality):
    def json(self):
        return json.dumps(self, cls=GenericEncoder)

    @classmethod
    def from_json(cls, json):
        return cls(**json)

GenericEncoder代码:

class GenericEncoder(json.JSONEncoder):
    def default(self, obj):
        return obj.__dict__
关注者
0
被浏览
67
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如注释中所述,它from是一个Python关键字,因此您不能将其用作变量名或属性名。因此,您需要使用备用名称,并在读取或写入JSON数据时进行转换。

    要进行输出转换,您可以为提供新的编码器json.dumps;您可以通过重写ExchangeRates.json方法来做到这一点。要进行输入转换,请覆盖ExchangeRates.from_json

    在这两种情况下,策略都是相似的:我们创建字典的副本(因此我们不会对原始字典进行变异),然后创建具有所需名称和值的新键,然后删除旧键。

    这是一个在Python 2.6和3.6上测试过的快速演示:

    import json
    
    class PropertyEquality(object):
        def __eq__(self, other):
            return (isinstance(other, self.__class__) and self.__dict__ == other.__dict__)
    
        def __ne__(self, other):
            return not self.__eq__(other)
    
        def __repr__(self):
            return '%s(%s)' % (self.__class__.__name__, ', '.join(['%s=%s' % (k, v) for (k, v) in self.__dict__.items()]))
    
    class JsonAware(PropertyEquality):
        def json(self):
            return json.dumps(self, cls=GenericEncoder)
    
        @classmethod
        def from_json(cls, json):
            return cls(**json)
    
    class ExchangeRatesEncoder(json.JSONEncoder):
        def default(self, obj):
            d = obj.__dict__.copy()
            d['from'] = d['frm']
            del d['frm']
            return d
    
    class ExchangeRates(JsonAware):
        def __init__(self, frm, to, rate):
            self.frm = frm
            self.to = to
            self.rate = rate
    
        def json(self):
            return json.dumps(self, cls=ExchangeRatesEncoder)
    
        @classmethod
        def from_json(cls, json):
            d = json.copy()
            d['frm'] = d['from']
            del d['from']
            return cls(**d)
    
    # Test
    
    a = ExchangeRates('a', 'b', 1.23)
    print(a.json())
    
    jdict = {"from": "z", "to": "y", "rate": 4.56, }
    
    b = ExchangeRates.from_json(jdict)
    print(b.json())
    

    典型输出

    {"from": "a", "to": "b", "rate": 1.23}
    {"from": "z", "to": "y", "rate": 4.56}
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看