首页 > 解决方案 > 字典的值依赖于/链接到 Python 中另一个字典的值

问题描述

我需要创建一个字典,其值依赖于/链接到 Python 中另一个字典的值。

最小工作示例:

from pprint import pprint
import os

miscellaneous = {'input_dir': "Results/Job_test/Input/",
                 'output_dir': "Results/Job_test/Output/",
                 'file_name_basis': "truss",
                 'file_name_extension_input': ".input",
                 'file_name_extension_output': ".output",
                 'screen_width_to_height_ratio': 16 / 9}

postprocessing = {'archive': {'execute': False,
                              'type': 'xztar',
                              'file_name_basis': miscellaneous['file_name_basis'],
                              'file_name_extension': ".tar.xz",
                              'output_dir': miscellaneous['output_dir'],
                              'directory_to_archive': "."}}

# Input_definition, final assembly.
input_def = {'miscellaneous': miscellaneous,
             'postprocessing': postprocessing}

pprint(input_def)
miscellaneous.update({'output_dir': "I_made_it/"})
print("================================================================================")
pprint(input_def)  # Only input_def['miscellaneous']['output_dir'] changed, but not input_def['postprocessing']['archive']['output_dir'].

我应该改变什么,不仅input_def['miscellaneous']['output_dir']改变,I_made_it/而且input_def['postprocessing']['archive']['output_dir']改变I_made_it/

标签: pythondictionarydependencies

解决方案


'output_dir': miscellaneous['output_dir'],减速和定义中的表达式在postprocessing赋值时进行评估 - 不保留状态。

为了拥有状态,您可以使用对象。一个小的工作示例可能是:

class MyOutputDir(object):
    outputDir = ""

outputDirInstance = MyOutputDir()
outputDirInstance.outputDir = "This is one value"

d1 = {"o1": outputDirInstance}

d2 = {"o1": d1["o1"]}

print(d2["o1"].outputDir)
# prints: 'This is one value'

d2["o1"].outputDir = "Another, newer value"

print(d1["o1"].outputDir)
# prints: 'Another, newer value'

要阅读有关 python 中的类和对象的更多信息,请参阅https://docs.python.org/3.7/tutorial/classes.html:那里可能有更多您可能会觉得有用的信息,因为您似乎正在“拉伸”限制dicts(数据)应该做什么,你可能应该考虑一种更面向对象的方法。

祝你好运 :)


推荐阅读