繁体   English   中英

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

[英]How do I use a keyword as a variable name?

我有以下类,其中包含变量fromtorate from是一个关键字。 如果我想在下面的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)

通用编码器代码:

class GenericEncoder(json.JSONEncoder):
    def default(self, obj):
        return obj.__dict__

为您的首选名称添加一个下划线:from_ 和 to_

(见PEP 8

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

使用同义词。 改为尝试“起源”或“来源”。

正如评论中提到的, 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}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM