当前位置: 首页 > 面试题库 >

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

澹台文博
2023-03-14
问题内容

我有以下带有变量的类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__

问题答案:

如注释中所述,它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}


 类似资料:
  • 问题内容: 在VB.NET中,我们可以将变量名称括在方括号中,并使用关键字作为变量名称,如下所示: 相当于C#: 我想知道是否有Java相当于这样做? 问题答案: 不可以。您可以添加下划线或类似的废话,但是基本上关键字是不可行的。

  • 问题内容: 解决以下问题 的最有效方法 是什么?从交互式外壳程序: 目前,我正在解决以下问题: 但是看起来很笨拙… (python 2.7+或3.2+解决方案都可以) 问题答案: 使用关键字参数解包:

  • 问题内容: 我有需要转换为Java对象的JSON。我需要处理的JSON如下所示: 在搜索引擎(在本例中为“ Jobs”)中输入搜索关键字时,将返回此JSON。我还没有命名这些要创建的变量,这个JSON只是从类似的早期应用程序中“送给”我的。因此,我显然在保存变量和抽象变量方面遇到麻烦。抽象是一个保留关键字,在我读过的任何地方,保留关键字都不能用作变量名。 我无法访问正在更新的以前的应用程序,我想指

  • 问题内容: 为什么下面的工作? 而这不起作用: 更清楚地说:目前,我无法将CSS属性作为变量传递给animate函数。 问题答案: 是有效的对象文字。该代码将创建一个对象,其属性名为,值为10。以下两项相同: 在ES5及更早版本中,不能在对象文字中使用变量作为属性名称。您唯一的选择是执行以下操作: ES6 将 _ComputedPropertyName_定义为对象文字语法的一部分,这使您可以编写如

  • 问题内容: 具体来说,我正在尝试使用字符串任意过滤ORM。我已经尝试过exec和eval解决方案,但是我遇到了麻烦。下面的代码不起作用,但这是我知道如何解释我要去的地方的最好方法 问题答案:

  • 问题内容: 假设我有一个这样的模型: 为了从纽约获得用户列表,这是我的查询: 为了获得去USC的用户列表,这是我的查询: 为了获得纽约的用户列表以及去过南加州大学的用户,这是我的查询: 现在,我想基于变量的值动态生成这些查询。 例如,我的变量可能如下所示: 或像这样: …甚至像这样: 您能帮我编写一个将字典(或词典列表)作为输入,然后动态构建正确的sqlalchemy查询的函数吗? 如果我尝试为关