在 Python 中,我可以从主函数调用变量 - 使用全局变量吗?
In Python, can I call the variable from main function - use global variable?
在Python中,我可以从主函数调用变量吗?使用全局变量?任何帮助表示赞赏!
def main(dataset, n_h, n_y, batch_size, dev_split, n_epochs):
input_to_state = Linear(name='input_to_state',
input_dim=seq_u.shape[-1],
output_dim=n_h)
global RNN # correct?
RNN = SimpleRecurrent(activation=Tanh(),
dim=n_h, name="RNN")
def predict(dev_X):
dev_transform = main.input_to_state.apply(dev_X) #? call "input_to_state", which one is correct?
dev_transform = input_to_state.apply(dev_X) #?
dev_h = main.RNN.apply(dev_transform) #? call "RNN", which one is correct?
dev_h = RNN.apply(dev_transform) #?
if __name__ == "__main__":
def predict(dev_X): # one more question: can predict function be added here?
dataset = ....
main(dataset, n_h, n_y, batch_size, dev_split, 5000)
get_predictions = theano.function([dev_X], predict) # call predict function
试试这个。
main.py
__dataset__ = main(dataset, n_h, n_y, batch_size, dev_split, 5000)
sub.py
import sys, main
__dataset__ = sys.modules['__main__'].__dataset__
编辑:
另一种方法是使用带有静态变量的 class。
mclass.py
class MClass:
i = 0
MClass.i = 1
main.py
import sub
from mclass import MClass
# In the main file
print(MClass.i) # Outputs 1
MClass.i = 3
print(MClass.i) # Outputs 3
# In a subfile
sub.mPrint() # Outputs 3
sub.set(10)
sub.mPrint() # Outputs 10
# And back in the main
print(MClass.i) # Outputs 10
sub.py
from mclass import MClass
def mPrint():
print(MClass.i)
def set(n):
MClass.i = n
你必须在'main'函数外定义'input_to_state'和'RNN',然后再修改它们。像这样:
input_to_state = None
RNN = None
def main(dataset, n_h, n_y, batch_size, dev_split, n_epochs):
# Calling 'global' allows you to modify these variables
global input_to_state
global RNN
input_to_state = Linear(name='input_to_state',
input_dim=seq_u.shape[-1],
output_dim=n_h)
RNN = SimpleRecurrent(activation=Tanh(),
dim=n_h, name="RNN")
def predict(dev_X):
dev_transform = input_to_state.apply(dev_X)
dev_h = RNN.apply(dev_transform)
if __name__ == "__main__":
main(args)
predict(dev_X)
不过,我不建议这样做,全局变量应该尽量少用。 more detail here.
一个更好的解决方案是 return 'input_to_state' 和 'RNN' 在 main 函数的末尾,像这样:
def main(dataset, n_h, n_y, batch_size, dev_split, n_epochs):
input_to_state = Linear(name='input_to_state',
input_dim=seq_u.shape[-1],
output_dim=n_h)
RNN = SimpleRecurrent(activation=Tanh(),
dim=n_h, name="RNN")
return input_to_state, RNN
def predict(dev_X, input_to_state, RNN):
dev_transform = input_to_state.apply(dev_X)
dev_h = RNN.apply(dev_transform)
if __name__ == "__main__":
input_to_state, RNN = main(args)
predict(dev_X, input_to_state, RNN)
在Python中,我可以从主函数调用变量吗?使用全局变量?任何帮助表示赞赏!
def main(dataset, n_h, n_y, batch_size, dev_split, n_epochs):
input_to_state = Linear(name='input_to_state',
input_dim=seq_u.shape[-1],
output_dim=n_h)
global RNN # correct?
RNN = SimpleRecurrent(activation=Tanh(),
dim=n_h, name="RNN")
def predict(dev_X):
dev_transform = main.input_to_state.apply(dev_X) #? call "input_to_state", which one is correct?
dev_transform = input_to_state.apply(dev_X) #?
dev_h = main.RNN.apply(dev_transform) #? call "RNN", which one is correct?
dev_h = RNN.apply(dev_transform) #?
if __name__ == "__main__":
def predict(dev_X): # one more question: can predict function be added here?
dataset = ....
main(dataset, n_h, n_y, batch_size, dev_split, 5000)
get_predictions = theano.function([dev_X], predict) # call predict function
试试这个。
main.py
__dataset__ = main(dataset, n_h, n_y, batch_size, dev_split, 5000)
sub.py
import sys, main
__dataset__ = sys.modules['__main__'].__dataset__
编辑:
另一种方法是使用带有静态变量的 class。
mclass.py
class MClass:
i = 0
MClass.i = 1
main.py
import sub
from mclass import MClass
# In the main file
print(MClass.i) # Outputs 1
MClass.i = 3
print(MClass.i) # Outputs 3
# In a subfile
sub.mPrint() # Outputs 3
sub.set(10)
sub.mPrint() # Outputs 10
# And back in the main
print(MClass.i) # Outputs 10
sub.py
from mclass import MClass
def mPrint():
print(MClass.i)
def set(n):
MClass.i = n
你必须在'main'函数外定义'input_to_state'和'RNN',然后再修改它们。像这样:
input_to_state = None
RNN = None
def main(dataset, n_h, n_y, batch_size, dev_split, n_epochs):
# Calling 'global' allows you to modify these variables
global input_to_state
global RNN
input_to_state = Linear(name='input_to_state',
input_dim=seq_u.shape[-1],
output_dim=n_h)
RNN = SimpleRecurrent(activation=Tanh(),
dim=n_h, name="RNN")
def predict(dev_X):
dev_transform = input_to_state.apply(dev_X)
dev_h = RNN.apply(dev_transform)
if __name__ == "__main__":
main(args)
predict(dev_X)
不过,我不建议这样做,全局变量应该尽量少用。 more detail here.
一个更好的解决方案是 return 'input_to_state' 和 'RNN' 在 main 函数的末尾,像这样:
def main(dataset, n_h, n_y, batch_size, dev_split, n_epochs):
input_to_state = Linear(name='input_to_state',
input_dim=seq_u.shape[-1],
output_dim=n_h)
RNN = SimpleRecurrent(activation=Tanh(),
dim=n_h, name="RNN")
return input_to_state, RNN
def predict(dev_X, input_to_state, RNN):
dev_transform = input_to_state.apply(dev_X)
dev_h = RNN.apply(dev_transform)
if __name__ == "__main__":
input_to_state, RNN = main(args)
predict(dev_X, input_to_state, RNN)