我需要重构代码以添加更多具有许多相似使用变量的方程并保持代码简洁

问题描述 投票:0回答:1

我需要添加 20 个左右的国家/地区,其部分变量名称如英国、美国,每个国家都有多个方程,每个方程在结构上都是相同的。

显示了一些典型的代码行(“model.add”等用于求解器输入,可以忽略): #(-1) 不是 -1,它在模型求解器中具有对前一周期的引用的含义。 #UKUS 的意思是“从到”。只需将前两个字符视为感兴趣的 VAR。 RUK 与英国一样受到关注。 #我不是在问如何重写代码,而是在问如何重构它。

model.add('YDrUK = (YUK + RUK(-1)*BdUKUK(-1) + XRUS*RUS(-1)*BsUKUS(-1))*(1 - thetaUK) + d(XRUS)*BsUKUS(-1)')
model.add('YDhsUK = YDrUK + d(XRUS)*BsUKUS(-1)') # 12.2 : Haig-Simons disposable income in the UK
model.add('VUK - VUK(-1) = YDrUK - CONSUK')      # 12.3 : Wealth accumulation in the UK
# 12.4 : Disposable income in the US
model.add('YDrUS = (YUS + RUS(-1)*BdUSUS(-1) + XRUK*RUK(-1)*BsUSUK(-1))*(1 - thetaUS) + d(XRUK)*BsUSUK(-1)')
model.add('YDhsUS = YDrUS + d(XRUK)*BsUSUK(-1)') # 12.5 : Haig-Simons disposable income in the US
model.add('VUS - VUS(-1) = YDrUS - CONSUS')      # 12.6 : Wealth accumulation in the US
model.add('TUK = thetaUK*(YUK + RUK(-1)*BdUKUK(-1) + XRUS*RUS(-1)*BsUKUS(-1))')  # 12.7 : Taxes in the UK
model.add('TUS = thetaUS*(YUS + RUS(-1)*BdUSUS(-1) + XRUK*RUK(-1)*BsUSUK(-1))')  # 12.8 : Taxes in the US


model.add('FcbUK = RUK(-1)*BcbdUKUK(-1) + RUS(-1)*BcbsUKUS(-1)*XRUS')  # 12.11 : UK central bank profits
model.add('FcbUS = RUS(-1)*BcbdUSUS(-1)')        # 12.12 : US central bank profits
model.add('BsUK = BsUK(-1) + GUK + RUK(-1)*BsUK(-1) - TUK - FcbUK')  # 12.13 : UK Govt budget constraint
model.add('BsUS = BsUS(-1) + GUS + RUS(-1)*BsUS(-1) - TUS - FcbUS')  # 12.14 : US Govt budget constraint

注意,代码应用于求解器,其中 (-1) 表示前一周期

我正在寻找类似 [[i,j,k],[i,j,k]..] 的东西,其中 i="a Uk 变量/引用", j ="a US 变量/引用" [i,j,k]第一个单元格和行“FcbUK=”的位置 i,j 中的特定变量,例如 YDrUK、YDrUS 与后续的 [i,,]. 或更好的变量相关联。

我想我也许能够将数组中的索引与每个变量关联起来,但我不知道该怎么做。 或者,我认为我可以编写一行来选择与索引相对应的国家/地区名称,以便进行图表和文件输出。这是显示国家名称及其针对每个国家的贸易或国民生产总值的图的数据。 我正在寻找的是易于维护以添加国家/地区和更改参数,以及总体上最小的 LOC。

python reference indirection
1个回答
0
投票

您可以使用 f 字符串按照以下方式编写它(我在这里使用

print
而不是
model.add
):

from itertools import product

countries = ['UK', 'US', 'DE']


# Example for equation with one country:

for c in countries:
    print(f'V{c} - V{c}(-1) = YDr{c} - CONS{c}')


# Example for equation with two countries:

for c1, c2 in product(countries, repeat=2):
    if c1 == c2:
        continue

    print(f'YDhs{c1} = YDr{c1} + d(XR{c2})*Bs{c1}{c2}(-1)')

输出:

VUK - VUK(-1) = YDrUK - CONSUK
VUS - VUS(-1) = YDrUS - CONSUS
VDE - VDE(-1) = YDrDE - CONSDE
YDhsUK = YDrUK + d(XRUS)*BsUKUS(-1)
YDhsUK = YDrUK + d(XRDE)*BsUKDE(-1)
YDhsUS = YDrUS + d(XRUK)*BsUSUK(-1)
YDhsUS = YDrUS + d(XRDE)*BsUSDE(-1)
YDhsDE = YDrDE + d(XRUK)*BsDEUK(-1)
YDhsDE = YDrDE + d(XRUS)*BsDEUS(-1)
© www.soinside.com 2019 - 2024. All rights reserved.