Мне нужно работать с функциями и объектами, которые принимают большое количество переменных.
В конкретном случае рассмотрим функцию из отдельного модуля, которая принимает N различных переменных, которые затем передают их новому экземпляру объекта:
def Function(Variables):
Do something with some of the variables
object1 = someobject(some of the variables)
object2 = anotherobject(some of the variables, not necessarily as in object1)
Хотя я могу просто передать длинный список переменных, время от времени я нахожу себя вносящим изменения в одну функцию, которая требует внесения изменений в другие функции, которые она может вызывать, или объекты, которые она может создавать. Иногда список переменных может немного измениться.
Есть ли хороший элегантный способ передать большую группу переменных и сохранить гибкость?
Я пытался использовать kwargs следующим образом:
def Function(**kwargs):
Rest of the function
и вызов функции (** somedict), где somedict - это словарь, в котором есть ключи и значения всех переменных, которые мне нужно передать в функцию (и, возможно, некоторые другие). Но я получаю ошибку о неопределенных глобальных переменных.
Edit1:
Я опубликую часть кода позже, так как меня сейчас нет дома или в лаборатории. До этого я постараюсь лучше объяснить ситуацию.
У меня есть симуляция молекулярной динамики, которая принимает несколько десятков параметров. Немногие из параметров (например, температура) должны быть повторены. Чтобы хорошо использовать четырехъядерный процессор, я параллельно запускал разные итерации. Таким образом, код начинается с цикла по разной итерации и на каждом проходе отправляет эти параметры этой итерации в пул рабочих (используя многопроцессорный модуль). Это выглядит примерно так:
P = mp.pool(number of workers) # If i remember correctly this line
for iteration in Iterations:
assign values to parameters
P.apply_async(run,(list of parameters),callback = some post processing)
P.close()
P.join()
Запуск функции берет список параметров и генерирует объекты моделирования, каждый из которых принимает некоторые параметры в качестве своих атрибутов.
Edit2:
Вот версия проблемной функции. **kwargs
содержит все параметры, необходимые для 'sim', 'lattice' и 'adatom'.
def run(**kwargs):
"""'run' runs a single simulation process.
j is the index number of the simulation run.
The code generates an independent random seed for the initial conditios."""
scipy.random.seed()
sim = MDF.Simulation(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat,savetemp)
lattice = MDF.Lattice(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, kb, ks, kbs, a, p, q, massL, randinit, initvel, parangle,scaletemp,savetemp,freeze)
adatom = MDF.Adatom(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, ra, massa, amorse, bmorse, r0, z0, name, lattice, samplerate,savetemp,adatomrelax)
bad = 1
print 'Starting simulation run number %g\nrun' % (j+1)
while bad is 1:
# If the simulation did not complete successfuly, run it again.
bad = sim.timeloop(lattice,adatom1,j)
print 'Starting post processing'
# Return the temperature and adatomś trajectory and velocity
List = [j,lattice.temp , adatom1.traj ,adatom1.velocity, lattice.Toptemp, lattice.Bottomtemp, lattice.middletemp, lattice.latticetop]
return List