LINUX.ORG.RU

Использование модуля в модулях

 


0

2

Доброй ночи. Интересует возможность использования в Python модулей в других модулях. Допустим у меня есть собственный модуль, который я импортирую из локального каталога, путём sys.path.append и import, ему нужен курсор MySQL(cur) и сам модуль MySQL(для перехвата исключений).

Обычно я указываю это в args, например что-то вроде:

def blabla(cur, MySQLdb, logging):

Или же импортирую модуль __builtin__, и назначаю глобальный cur и MySQL.

Ну и хотел всё-таки спросить - как правильно делать такие вещи? Передавать курсоры в аргументах, или же устанавливать их глобально? Либо как-то ещё?

ЯННП.

Модули как правило устанавливаются с помощью setuptools, sys.path при этом трогать ненужно.

Как расшаривать соединение, уже зависит от конкретной задачи.

Kilte ★★★★★
()

Или же импортирую модуль __builtin__, и назначаю глобальный cur и MySQL.

Святый Боже. Так не надо делать.

Ну и хотел всё-таки спросить - как правильно делать такие вещи? Передавать курсоры в аргументах, или же устанавливать их глобально? Либо как-то ещё?

Как «глобально»? Один курсор на всю программу?

Либо передавать в аргументах, либо писать свою абстракцию для всей работы с БД, если так в твоём случае лучше. Но это только моё мнение.

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

Да это фигня про модули. Я спрашивал как более правильней использовать один курсор к MySQL(или что-то другое) в любом загружаемом модуле программы.

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

Да, на всю программу. Я и делаю сейчас всё в аргументах, передаю в аргументах, но так слишком много всего писать приходиться. Попробовал через builtin - могу пользовать cur из любого места, из которого хочу. Но через builtin как-то неправильно, чтоли. :)

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

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

Я и делаю сейчас всё в аргументах, передаю в аргументах, но так слишком много всего писать приходиться.

Может, ты спроектировал неудачно? Может, надо было где-то написать класс, у которого конструктор бы принимал и сохранял большую часть данных, а не передавать их каждому методу отдельно?

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

Да, наверное всё-таки последнее. Всем спасибо, буду думать, как правильней поступить. :)

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

Ну тогда варианта два:

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

import mysql

cur = mysql.cur(....)

И потом в других модулях делаем импорт:

import mymysql

try:
 mymysql.cur.execute(.....)
except mymysql.mysql.MysqlException:
 raise

Либо же можно сделать один объект со всем нужным внутри, и передавать его:

import mysql
myobj = object()
myobj.cur = mysql.cur(.....)
myobj.mysql = mysql

def myfunc(myobj):
 try:
  myobj.cur.execute(.....)
 except myobj.mysql.MyError:
  raise    

redixin ★★★★
()

В python есть ООП. Почитай про него что-нибудь.

xpahos ★★★★★
()

Или же импортирую модуль __builtin__, и назначаю глобальный cur и MySQL.

Я думаю, это недостаточно pythonic. Лучше сделай так: Напиши свой кодек, скажем, utf-8_with_MYSQL_CUR(как образец возьми кодек utf-8), определи свой собственный оператор (например, 8==>, который будет обозначать ссылку на глобальный курсор cur) и используй его там, где нужно. Код любого модуля будет выглядеть так:

# coding: utf-8_with_MYSQL_CUR 

8==>.execute (...)
Explicit лучше, чем implicit, все дела.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)

Создай класс, который будет инкапсулировать курсор. Создавай объект этого класса в другом модуле и вызывай методы на нем.

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