Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 12, 2016 08:49:37

xxd103
Зарегистрирован: 2015-12-18
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

вызов модуля с передачей переменной

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

для примера:

# pr1.py
import xlrd
FileIn = r“c:\pyt” + “0115.xlsx”
rb = xlrd.open_workbook(FileIn)
sheet = rb.sheet_by_index(0)
………..

и дальше идет обработка таблицы.



хотел написать, предварительно убрав формирование строки FileIn из pr1.py :

# pr2.py
Month =
File01 = r“c:\pyt\0115.xlsx”
for i in range (len(Month)-1):
FileIn = FileIn01 + Month + FileIn01
import pr1



Но строка FileIn не передается в импортируемый модуль.
Есть варианты, как ее сделать видимой (общей) для всей среды?

P.S. отступы не отразились
Спасибо.

Отредактировано xxd103 (Фев. 12, 2016 08:50:40)

Офлайн

#2 Фев. 12, 2016 09:05:49

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

вызов модуля с передачей переменной

xxd103
есть программа 1 - в которой производятся определенные манипуляции с файлом.
Надо её всю занести в функцию, а у функции сделать параметр.

testfunc.py
#!/usr/bin/env python3
 
def f(name):
    print(name * 10)
 
def main():
    f('abc')
 
if __name__ == '__main__':
    main()

В командной строке потом
[guest@localhost py]$ ./testfunc.py 
abcabcabcabcabcabcabcabcabcabc
[guest@localhost py]$

А в другом скрипте
>>> import testfunc
>>> testfunc.f('x')
xxxxxxxxxx
>>> testfunc.f('123')
123123123123123123123123123123
>>> 



Офлайн

#3 Фев. 12, 2016 09:45:36

xxd103
Зарегистрирован: 2015-12-18
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

вызов модуля с передачей переменной

тут придется весь программный код в pr1.py сдвигать вправо. это очень геморно. других нет вариантов?

Офлайн

#4 Фев. 12, 2016 10:15:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

вызов модуля с передачей переменной

xxd103
тут придется весь программный код в pr1.py сдвигать вправо
Да, придётся. Можешь продолжать, конечно, планомерно строить один геморрой на другом, чтобы в конце вообще всё выкинуть.

То, что ты запускаешь скрипт путём импортирования, - это уже неправильный шаг. Ворота (if __name__ …) для того и существуют, чтобы можно было как сам скрипт запускать, так и импортировать из него любые элементы без запуска всего остального.

Вся хрень тоже не должна идти скопом; код должен быть разбит на функции, где каждая занимается своим конкретным делом. Тогда любую такую функцию можно взять и использовать сотню раз, не выполняя остальной код, который может быть неподходящим.



Отредактировано py.user.next (Фев. 12, 2016 10:17:57)

Офлайн

#5 Фев. 12, 2016 10:23:53

xxd103
Зарегистрирован: 2015-12-18
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

вызов модуля с передачей переменной

py.user.next

все ты правильно говоришь.
Просто я больше 20 лет не писал коды. и с ходу решил наскочить на питон.
Очень многое не привычно и вне понимания (так как мышление программирования старое).
Буду себя менять.
Переход на функции - правильный подход. Просто было лень все переписывать.

Офлайн

#6 Фев. 12, 2016 10:39:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

вызов модуля с передачей переменной

xxd103
Просто я больше 20 лет не писал коды. и с ходу решил наскочить на питон.
Где-то пропустил wiki. структурное программирование



Офлайн

#7 Фев. 12, 2016 19:53:30

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

вызов модуля с передачей переменной

xxd103
тут придется весь программный код в pr1.py сдвигать вправо. это очень геморно
Ничего это не геморно. Практически в любом нормальном тектовом редакторе выделяете все и жмете tab.

Для программирования прежде всего надо свободно владеть текстовым редактором.



Офлайн

#8 Фев. 13, 2016 02:12:34

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

вызов модуля с передачей переменной

doza_and
Практически в любом нормальном тектовом редакторе выделяете все и жмете tab.
Можно использовать sed
sed -i~ '3,$s/^/    /' file.py
Но если в любом редакторе, то надо искать редактор с вертикальной вставкой, потому что это самое точное средство.

В Emacs'е, кстати, есть команда Ctrl + i - это вставка/удаление отступа, но если её сделать для выделенного блока в питоне (режим питона), отступы меняются, но сбиваются (глубоки блоки могут съезжать не туда). Поэтому там применяется Ctrl + x + TAB с аргументом 4, аргумент вводится через Alt + 4 или просто через Ctrl + u (это по дефолту равно 4). В Emacs'е, вообще, по-разному это можно сделать (замена по регекспу, вставка префикса для выделения, макрос для одной строки, вставка прямоугольника с пробелами, а можно прямо для выделения вызвать системный sed). Emacs очень гибкий в плане работы с текстом.



Отредактировано py.user.next (Фев. 13, 2016 02:15:05)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version