Подтвердить что ты не робот

Разделить исходный код 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 ... во внешний файл, который будет просто читаться так, как если бы он находился в файле, из которого он вызван?

4b9b3361

Ответ 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 только для побочного эффекта генерации вывода, а не для создания отдельных исходных файлов.