如何使用字典键作为函数变量名?

How to use dictionary keys as function variable names?

我正在编写具有多个函数的代码,其中大多数函数都包含相同的变量。我在下面提供了一些示例函数。

# First sample function 
def cg2RollAxisHeight(z_frc, z_rrc, l_w, x_cg, z_cg):
    theta = np.arctan((z_rrc-z_frc)/l_w)
    z_axis = np.tan(theta)*l_w*x_cg
    return z_cg-(z_axis + z_frc)

# Second Sample function
def FrontLateralWT(W, l_w, t_f, K_phiF, K_phiR, A_Y, z_frc, z_rrc, x_cg, z_cg):
    H = CG.cg2RollAxisHeight(z_frc, z_rrc, l_w, x_cg, z_cg)
    b = l_w-(l_w*x_cg)
    return A_Y*W/t_f*(H*K_phiF/(K_phiF+K_phiR)+b/l_w*z_frc)

我希望能够在单个对象(例如字典)中定义所有变量和变量名称,并能够让我的函数从该对象中提取所需的变量。

我试过以下列方式使用 **kwargs:

def cg2RollAxisHeight(**kwargs):
    theta = np.arctan((z_rrc-z_frc)/l_w)
    z_axis = np.tan(theta)*l_w*x_cg
    return z_cg-(z_axis + z_frc)

kwargs = {'W': 180, 'l_w': 2.4, 't_f': 1540, 'K_phiF': 78000, 'K_phiR': 46000,
          'A_Y': 2.5, 'z_frc': 25, 'z_rrc': 60, 'x_cg': .6, 'z_cg': .4}

test = cg2RollAxisHeight(**kwargs)
print(test)

这里的问题是函数不将键识别为变量名。有没有办法在函数中使用字典键作为变量名?或者有更好的方法来做我所追求的吗?我想避免使用列表,因为该函数几乎无法破译。

def cg2RollAxisHeight(params):
    theta = np.arctan((params[7]-params[6])/params[1])
    z_axis = np.tan(theta)*params[1]*params[9]
    return paramms[10]-(z_axis + params[6])

params = [180, 2.4, 1540, 78000, 46000, 2.5, 25, 60, 0.6, 0.4}

test = cg2RollAxisHeight(params)
print(test)

虽然上述解决方案确实有效,但它不是一个完美的解决方案,我必须对许多其他更大的函数执行相同的操作。不理想!有没有一种方法可以在不编辑函数主体的情况下创建一个可以传递给多个函数的对象?

试试 globals()[your_dictionary.keys[index_of_the_key]]
globals()[ ] returns [ ] 中的字符串作为变量名 https://www.pythonpool.com/python-globals/#:~:text=Python%20globals()%20function%20is,the%20global%20scope%20actually%20contains.

这就是我让你的代码工作的方式:

import numpy as np

zeDict = {'W': 180, 'l_w': 2.4, 't_f': 1540, 'K_phiF': 78000, 'K_phiR': 46000,
          'A_Y': 2.5, 'z_frc': 25, 'z_rrc': 60, 'x_cg': .6, 'z_cg': .4}

def cg2RollAxisHeight(myDict):
    theta = np.arctan((myDict['z_rrc']-myDict['z_frc'])/myDict['l_w'])
    z_axis = np.tan(theta)*myDict['l_w']*myDict['x_cg']
    return myDict['z_cg']-(z_axis + myDict['z_frc'])


test = cg2RollAxisHeight(zeDict)
print(test)

在我看来,您的方法可能会在很长一段时间内遭受不必要的复杂性 运行。我建议使用 类.

import numpy as np

class cg2:
  def __init__(self):
    # Please, initialize properly
    self.W = 180
    self.l_w = 2.4
    self.t_f = 1540
    self.K_phiF = 78000
    self.K_phiR = 46000
    self.A_Y = 2.5
    self.z_frc = 25
    self.z_rrc = 60
    self.x_cg = .6
    self.z_cg = .4

  def RollAxisHeight(self):
    theta = np.arctan((self.z_rrc-self.z_frc)/self.l_w)
    z_axis = np.tan(theta)*self.l_w*self.x_cg
    return self.z_cg-(z_axis + self.z_frc)
    
  def update(self):
    # Code that updates your parameters goes here
    pass

cg2obj = cg2()
test = cg2obj.RollAxisHeight()
print(test)