LINUX.ORG.RU

Python: вопрос по организации модуля

 ,


0

2

Всем привет!

Написал некоторую симуляцию физического процесса с использованием numpy и теперь желаю структурировать проект по людски.

Что имеем сейчас (упростил для наглядности):

.
├── log/
├── output/
├── model.py
├── precalculations.py
├── properties.py
├── run.py
└── visualization.py
# run.py
import numpy as np
import precalculations

# defining up some model parameters here

import model
# model.py
import numpy as np
from properties import *
from run import ... # all the defined parameters

# defining some auxiliary functions here
# running calculations

Что мне не нравится:

  1. В файле run.py импортируется model.py в конце.
  2. В файле model.py импортируются переменные из run.py.

Что хочу получить в итоге? Воспроизводимые эксперименты, по одному файлу на эксперимент. В файле описаны все параметры, а все вычисления вынесены за его пределы.

Вопрос: как это грамотно организовать?

★★★★★

Циклические импорты чтоли? Это решается либо вынесением общих сущностей в третий модуль, либо через функции.

WitcherGeralt ★★
()

Циклические импорты что ли? Ничерта не понятно, но, ванную, закончится это либо выпилом одного из них, либо засовыванием одного из них в if __name__ == '__main__' :

t184256 ★★★★★
()
Ответ на: комментарий от yvv

Затем что не придумал пока как организовать взаимодействие разных частей кода, не передавая при этом по 20 параметров в каждую функцию.

aquadon ★★★★★
() автор топика
Ответ на: комментарий от t184256

закончится это либо выпилом одного из них

Выпилил пока один из них. Потом будет время почитать о модулях в python и обдумать желаемую структуру.

aquadon ★★★★★
() автор топика
Ответ на: комментарий от aquadon

У меня например каждый эксперимент - это модуль, в котором находятся все параметры. Также, эту проблему можно решить с помощью конфигов.

yvv ★★☆
()
Последнее исправление: yvv (всего исправлений: 1)
Ответ на: комментарий от aquadon

не передавая при этом по 20 параметров в каждую функцию

засовываешь параметры в объект, передаешь объект в ф-цию.

Dred ★★★★★
()
Ответ на: комментарий от aquadon

Схема немного сложная, но если в общих чертах, что-то типа этого

experiments/
    exp1/__init__.py
    exp2/__init__.py
    ...и т.д.
analysis/__init__.py
    grid.py
    field.py
    read_data.py
    plot.py
    ...и т.д.

в каждом exp*/__init__.py

expid='...'
data_path='...'
plot_path='...'
start_year=...
end_year=...
frequency=...
и т.д. все метаданные и докстринг

Далее в repl или в скрипте

import exp1
import analysis as ana

var=ana.read_data(exp1,'temperature')
var.mean(axis='time').plot()

Получаю график усреднённой по времени температуры из моего эксперимента. Ну и так далее. Не уверен, что это наилучший дезаен, но уже долго работает нормально.

yvv ★★☆
()
Ответ на: комментарий от aquadon

Сделать класс для экспериментов и по одному объекту на каждый?

Я пробовал делать эксперимент в виде класса, но остановился на модулях.

yvv ★★☆
()
Ответ на: комментарий от yvv

var=ana.read_data(exp1,‘temperature’)

Т.е. условия твоего эксперимента описаны в переменных модуля exp1 и ты передаешь имя модуля чтобы потом обратиться к его переменным из модуля analysis. Выглядит как объект, хоть в классическом понимании им и не является.

Поправь меня, если я неправильно понял.

aquadon ★★★★★
() автор топика
Последнее исправление: aquadon (всего исправлений: 1)
Ответ на: комментарий от aquadon

Ну да, модуль это типа объекта для содержания параметров эксперимента в данном случае. Можно для этой же цели какой-нибудь yaml конфиг использовать. Но мне показалось, что модуль использовать лучше (для моих целей), потому что туда в случае надобности можно и код вставить, напр

expid='exp1'
data_path=os.environ['NOBACKUP']+expid
и т.д.

что-то типа этого. Но это всё специфика.

yvv ★★☆
()
Ответ на: комментарий от aquadon

Звучит разумно

это общая практика

Сделать класс для экспериментов и по одному объекту на каждый?

да, к классу еще можно прикрутить методы для контрля(например конвертации) доступа к данным, либо переопределить магические методы (но не стоит)

Dred ★★★★★
()
Ответ на: комментарий от aquadon

Еще лучше было бы воспользоваться namedtuple. Оно еще и read-only по умолчанию, поэтому предохранит от ошибок.

lu4nik ★★★
()
Ответ на: комментарий от aquadon

Используй классы, параметры, которые часто используются, станут атрибутами

tz4678 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.