【问题标题】:How to de-structure variables in Python like in React?如何像 React 一样在 Python 中解构变量?
【发布时间】:2020-03-09 22:09:27
【问题描述】:

我正在使用 Flask 创建 API。 对于每个请求,我都必须验证 request.argsrequest.json 并在 query paramsrequest body 时抛出错误 是意外的形式或不同的 datatypeNone

然后从 request bodyquery params 中提取一些项目。有许多这样的 API,我需要从 query paramsrequest body 中提取一些项目并使用这些值执行数据库函数,例如执行SQL 查询并传递来自 请求正文查询参数 的数据。

每次在 API 视图函数中,我都必须为一个数字执行 request.args.getrequest.json.get的变量。

我只是在想是否有更好的方法可以使内存中的项目可用,而无需明确地将每个项目从字典中拉出(类似于 React 中的解构)。

我已经搜索并发现确实有一种方法可以做到这一点,这是不可取的。 https://stackoverflow.com/a/2955476/4626254

我只是想知道是否有更好的方法来做到这一点。

【问题讨论】:

  • Python 不支持字典解构之类的东西。自己做是最好的方法。请注意,链接的答案不正确
  • 在什么情况下解构?您可以使用 * 语法将字典或元组作为函数参数传递给 unpack,这类似于解构
  • 我假设您的意思是 JS 中的对象解构,例如 {a, b} = {a:1, b:2, c:3}。但是,是的,Python 不支持这一点。在 Python 中,您必须执行类似 a = my_dict['a']; b = my_dict['b'] 的操作
  • 是的。这就是我所指的。对象解构。
  • “pydantic”项目可能对您来说是一个不错的选择 - 您可以使用您将使用的参数创建一个类,并且使用最少的模糊度,并将您的 json 传递给它以获取经过验证的 Python 对象这很容易使用。 pydantic-docs.helpmanual.io - 或者只是自己编写一个基类和带有所需字段的实例类 - 这很简单。

标签: python local-variables destructuring


【解决方案1】:

operator.itemgetter,可让您一次检索多个项目。 (从语义上讲,它仍然从dict 中提取每个值;但从语法上讲,这是一个操作。)

from operator import itemgetter

keys = ['a', 'b']
d1 = {'a': 1, 'b': 2, 'c': 3}

get_a_and_b = itemgetter(*keys)  # equivalent to lambda d: (d['a'], d['b'])

values = get_a_and_b(d)  # KeyError if either a or b is missing, otherwise returns (1, 2)

d2 = dict(zip(keys, values))  # Build new "subdict" if desired.

【讨论】:

    【解决方案2】:

    如果你想让你的代码更简洁,而不是从dict 中一个一个地获取每个值,不想输入两次相同的键以将它们用作变量 - 然后创建一些辅助函数来解包您需要作为函数参数或关键字参数(取决于它们是否需要或可以具有默认值)并保持为**kwargs。例如。

    params = {c: i for i, c in enumerate('abcd')}
    
    def get_abcx_sum_and_rest(a, b, c=1, x=2, **kwargs):
        return sum((a,b,c,x)), kwargs
    
    abcx_sum, rest_dct = get_abcx_sum_and_rest(**params)
    

    Js es6 语法很好,但遗憾的是在 python 中不可用。我认为,如果您需要使用 dict 的某些键做某事,那么您可能应该将这些操作包含在单独的函数中并命名。

    【讨论】:

      猜你喜欢
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 2021-07-24
      • 1970-01-01
      • 2015-09-29
      • 2023-02-22
      • 1970-01-01
      相关资源
      最近更新 更多