【问题标题】:Can I reference a dict value on dict creation?我可以在创建字典时引用字典值吗?
【发布时间】:2018-07-16 10:50:52
【问题描述】:

我有这本字典,我想将netdev["ipv6"]["addr"] 的值设置为前者声明的netdev["ipv6"]["prefix"]

是否有任何优雅的方式可以“即时”执行此操作,或者我是否必须在 dict 声明之外使用 dict.update()、...等已知机制执行此操作?

net_dev = {
    "link_name": "eth0",
    "ipv4": {
        "address": "10.80.0.1",
        "mask": "255.255.255.0",
    },
    "ipv6": {
        "prefix": "2001:db8:0:1::",
        "addr": <HERE_THE_PREFIX_IS_USED> + "1234:1",
        "mask": "64",
        "prefix_range": "2001:db8:0:100::",
    }
}

【问题讨论】:

  • 由于 dict 在您定义它时不存在,我不确定您是否能够在创建之前引用此 dict 中的元素。
  • 如果prefix 的值发生变化,应该采取什么行为?
  • 可能不是您要查找的内容,但您可以在初始化 dict 之前定义第二个变量 prefix 并在两个键的值中使用它。

标签: python python-3.x dictionary


【解决方案1】:

是与否!您可以使用 f-strings(在 Python-3.6+ 中可用)根据已经可用的变量自动格式化字符串,在这种情况下可以是 netdev["ipv6"]["prefix"]。如果您在创建字典之前不知道netdev["ipv6"]["prefix"] 的值,那么将无法在飞行中执行此操作(至少在 Cpyhon 实现中或通常在 Python 级别)。但是,可能有一些技巧可以创建自定义字典,重新格式化预期键的值,如下所述:Can you set a dictionary value dependant on another dictionary entry?

PREFIX = previously_defined_prefix
net_dev = {
    "link_name": "eth0",
    "ipv4": {
        "address": "10.80.0.1",
        "mask": "255.255.255.0",
    },
    "ipv6": {
        "prefix": PREFIX,
        "addr": f"{PREFIX}1234:1",
        "mask": "64",
        "prefix_range": "2001:db8:0:100::",
    }
}

在这种情况下,PREFIX 是定义在与 net_dev 字典相同的名称空间中的变量。

在您使用 3.6- 版本而不是 f-string 方法时,您可以简单地使用 str.format() 或仅使用 + 运算符:

PREFIX = previously_defined_prefix
net_dev = {
    "link_name": "eth0",
    "ipv4": {
        "address": "10.80.0.1",
        "mask": "255.255.255.0",
    },
    "ipv6": {
        "prefix": PREFIX,
        "addr": "{}1234:1".format(PREFIX),  # PREFIX + "1234:1"
        "mask": "64",
        "prefix_range": "2001:db8:0:100::",
    }
}

【讨论】:

  • 这没有回答问题。没有可用的HERE_THE_PREFIX_IS_USED 变量,因为前缀仅分配给net_dev['ipv6']['prefix'](在评估字典时也不存在名称绑定)。
  • 我不是反对者,但我认为 OP 想要一个动态链接。像this 这样的东西,IMO,不推荐。
  • @AKX 没错,我用更多信息更新了答案。
  • @Kasramvd 我接受你的回答。由于我使用 python3.5,您能否提供一个没有 f-strings 的 sn-p 来完成?类似于 PREFIX + "1234:1"
猜你喜欢
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多