Как переопределить переменную переменную в функции извне? - PullRequest
1 голос
/ 24 сентября 2019
  • Отредактировано с учетом первоначальной обратной связи

Чтобы провести анализ чувствительности по некоторым параметрам в моей модели, я хочу перезаписать и переопределить одну переменную.Эта переменная может быть выбрана пользователем вручную.Я не могу заставить перезапись работать.

Пока я сосредоточился в основном на том, чтобы вернуть localals () или globals () к правильному значению, но, как показано ниже.это не сработало.

Две важные части моего кода: первая функция Main, выполняющая всю работу по созданию модели.В нем много переменных, одна из которых показана: Wave_height

def Main(loopname, loopvalue = 0):

    Wave_height = 2 #m
    # And_many_other_characteristics

    # redefine one single variable name
    vars()[loopname] = loopvalue
    globals()[loopname] = loopvalue
    locals()[loopname] = loopvalue
    print (Wave_height)

    return_info = 1 ## rows of code i dont want to bother you with ##

    return(return_info)

if __name__ == "__main__":
    Main("testname", 0)

Для анализа чувствительности мне бы хотелось, чтобы все переменные были постоянными, за исключением одной переменной.Предположим, я хочу изменить Wave_height.Я хочу сделать что-то вроде следующего кода:

import Main
import numpy as np

loopname = "Wave_height"
loopvalue = [1,2,3]

max_z_displacement = np.zeros(len(loopvalue))

for i in range (len(loopvalue)):
    return_info = Main.Main(loopname, loopvalue[i])
    max_z_displacement[i] = return_info[2]

В настоящее время распечатки выглядят следующим образом:

2

Я хотел бы получить результат:

1

Я бы хотел избежать использования 50 различных переменных в def-строке, так как это не облегчит использование.

1 Ответ

0 голосов
/ 24 сентября 2019

Чтобы вызываемая функция выглядела естественно, упакуйте параметры в объект, который в противном случае не имеет функций:

class Parameters(object):
  def __init__(self,**attr): vars(self).update(attr)
def calc(**over):
  p=Parameters(Wave_height=2,…)
  vars(p).update(over)
  do_stuff(p.Wave_height,…)
  do_more(p.other_data)
  …

for h in heights:
  calc(Wave_height=h)
  calc(**{"Wave_height":h})  # to choose parameter dynamically
...