【问题标题】:How can I get a named tuple instance from its name in python?如何从 python 中的名称中获取命名元组实例?
【发布时间】:2020-11-19 16:11:52
【问题描述】:

我有一组命名元组实例。例如:

   CostFN = namedtuple('CostFN', ['name', 'func', 'args'])
   tuple_lin_1 = CostFN(name="lin_1", args=args_for_1, func1=func_1)
   tuple_lin_2 = CostFN(name="lin_2", args=args_for_1, func1=func_2)
   tuple_lin_3 = CostFN(name="lin_3", args=args_for_2, func1=func_1)
   tuple_lin_4 = CostFN(name="lin_4", args=args_for_2, func1=func_2)

我正在保存实例名称,并且我想从其名称中访问相关实例。 就像是: my_tuple = CostFN.get("lin4") 我如何做到这一点?

【问题讨论】:

  • 你必须自己建立一个dictCostFN 本身并不知道自己的实例。

标签: python instance namedtuple


【解决方案1】:

你不能以任何合理的方式。对象并没有您认为的那样具有名称,名称与对象绑定。所以tuple_lin_4 是一个名称,它包含与CostFN 的关联实例的绑定,但该实例认为它已绑定到该名称。同样,实例知道它是CostFN 类型,但CostFN 不知道它自己的实例。所以你有两个层,其中的链接不能按你想要的方式工作。

如果按名称查找实例是一个问题,我建议将名称映射到实例的dict,而不是使用单独的命名变量。如果你真的想要,你可以用一个自定义的__new__ 来做可怕的事情,以在与类绑定的dict 上按名称缓存实例,但坦率地说,即使这样也太过分了;如果你认为你需要这样的行为,你可能有an XY problem

【讨论】:

  • 明确一点:gc.get_referrers 等有un合理的方法可以做到这一点。它们的效率非常低,如果你认为除了奇怪的调试场景之外你还需要它们(gc.get_referrers 自己的文档说“避免将get_referrers() 用于除调试。”),你;你有an XY problem,需要重新考虑你的Y。
猜你喜欢
  • 2012-06-11
  • 2013-08-22
  • 2012-06-14
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2018-08-22
  • 2019-07-08
  • 1970-01-01
相关资源
最近更新 更多