Разделить исходный код python на несколько файлов?
У меня есть код, который я хочу разделить на несколько файлов. В Matlab можно просто вызвать файл .m
, и до тех пор, пока он не определен как что-либо в частности, он просто запустится так, как если бы он был частью вызываемого кода. Пример (отредактированный):
test.m (matlab)
function [] = test()
... some code using variables ...
test2
test2.m (matlab)
... some more code using same variables ...
Вызов test
запускает код в тесте, а также код в test2.
Есть ли аналогичный способ для python поместить ... some more code ...
во внешний файл, который будет просто читаться так, как если бы он находился в файле, из которого он вызван?
Ответы
Ответ 1
Я изучаю использование модуля в python только сейчас и думал, что отвечу на вопрос, который Маркус просит в комментариях выше ( "Как импортировать переменные, когда они встроены в модули?" ) с двух сторон:
- переменная/функция и
- свойство/метод класса.
Вот как я переписал основную программу f1.py, чтобы продемонстрировать повторное использование переменной для Markus:
import f2
myStorage = f2.useMyVars(0) # initialze class and properties
for i in range(0,10):
print "Hello, "
f2.print_world()
myStorage.setMyVar(i)
f2.inc_gMyVar()
print "Display class property myVar:", myStorage.getMyVar()
print "Display global variable gMyVar:", f2.get_gMyVar()
Вот как я могу переписать повторно используемый модуль f2.py:
# Module: f2.py
# Example 1: functions to store and retrieve global variables
gMyVar = 0
def print_world():
print "World!"
def get_gMyVar():
return gMyVar # no need for global statement
def inc_gMyVar():
global gMyVar
gMyVar += 1
# Example 2: class methods to store and retrieve properties
class useMyVars(object):
def __init__(self, myVar):
self.myVar = myVar
def getMyVar(self):
return self.myVar
def setMyVar(self, myVar):
self.myVar = myVar
def print_helloWorld(self):
print "Hello, World!"
Когда выполняется f1.py, это будет выглядеть так:
%run "f1.py"
Hello,
World!
Hello,
World!
Hello,
World!
Hello,
World!
Hello,
World!
Hello,
World!
Hello,
World!
Hello,
World!
Hello,
World!
Hello,
World!
Display class property myVar: 9
Display global variable gMyVar: 10
Я думаю, что точка Маркуса была бы следующей:
- Чтобы повторно использовать код модуля более одного раза, введите код модуля в
функций или классов,
- Чтобы повторно использовать переменные, хранящиеся как свойства в модулях, инициализируйте
свойства внутри класса и добавить методы "getter" и "setter", чтобы
переменные не обязательно должны быть скопированы в основную программу,
- Чтобы повторно использовать переменные, хранящиеся в модулях, инициализируйте переменные и используйте
функции геттера и сеттера. Функции сеттера объявили бы
переменные как глобальные.
Ответ 2
Конечно!
#file -- test.py --
myvar = 42
def test_func():
print("Hello!")
Теперь этот файл ( "test.py" ) находится в терминологии python как "модуль". Мы можем импортировать его (пока он может быть найден в нашем PYTHONPATH
). Обратите внимание, что текущий каталог всегда находится в PYTHONPATH
, поэтому, если use_test
выполняется из того же каталога, где живет test.py
re all set:
#file -- use_test.py --
import test
test.test_func() #prints "Hello!"
print (test.myvar) #prints 42
from test import test_func #Only import the function directly into current namespace
test_func() #prints "Hello"
print (myvar) #Exception (NameError)
from test import *
test_func() #prints "Hello"
print(myvar) #prints 42
Вы можете сделать гораздо больше, чем просто с помощью специальных файлов __init__.py
, которые позволяют обрабатывать несколько файлов как один модуль), но это отвечает на ваш вопрос, и я полагаю, что мы оставим все остальное для в другой раз.
Ответ 3
У Python есть импорт и namespacing, которые хороши. В Python вы можете импортировать в текущее пространство имен, например:
>>> from test import disp
>>> disp('World!')
Или с пространством имен:
>>> import test
>>> test.disp('World!')
Ответ 4
Вы можете сделать то же самое в python, просто импортируя второй файл, код на верхнем уровне будет запускаться при импорте. Я бы предположил, что это в лучшем случае беспорядочно, а не хорошая практика программирования. Вам лучше организовать ваш код в modules
Пример:
F1.py:
print "Hello, "
import f2
F2.py:
print "World!"
При запуске:
python ./f1.py
Hello,
World!
Изменить, чтобы уточнить: часть, которую я предлагал, была "беспорядочной", использует оператор import
только для побочного эффекта генерации вывода, а не для создания отдельных исходных файлов.