有时我想在其他子程序中包含一个模块,但我只需要该模块中的几个子程序。有什么区别
use a_module, only: a_subroutine
或只是
use a_module
答案 0 :(得分:1)
这是一个完整的答案,其中一些已经在评论中进行了讨论。
来自Metcalf等。 (2011)第146页(Fortran参考书目),use a_module
提供(强调):
访问 all 所有公共命名数据对象,派生类型, 接口块,过程,通用标识符和名称列表组 在名为模块中。
相反,use a_module, only an_entity
提供:
仅在指定了实体...的情况下才能访问模块中的实体。
即use a_module
等同于不推荐使用的Python实践(例如[2]中的python):
from a_module import *
use a_module, only an_entity
等效于首选的python做法:
from a_module import an_entity
不幸的是,推荐的python做法
import module [as name]
或
import module.submodule [as name]
在Fortran中不可用,因为Fortran会将所有实体导入到全局名称空间中,而不是像python中那样通过模块的名称空间从模块访问实体,例如:
import numpy as np
array = np.array([1, 2, 3])
如评论和其他地方(例如[3])所述,为了代码清晰并避免命名空间污染/名称冲突(),显式导入(use a_module, only an_entity
)优于隐式导入(use a_module
)。 “明确胜于隐含”)。
Metcalf等。 (2011)还注意到,如果您需要从不同模块中使用两个具有相同名称的实体,则可以通过在本地重命名一个(或两个)冲突实体(即仅在您的程序/模块内)来避免名称冲突,例如
use stats_lib, only sprod => prod
use maths_lib, only prod
其中prod
的{{1}}使用名称stats_lib
在本地访问,而sprod
的{{1}}使用名称prod
在本地访问
偶然地,梅特卡夫等人。 (2011)还请注意:
如果名称中没有引用名称,则允许名称冲突 作用域。
即您可以成功编译:
maths_lib
没有问题,只要程序/模块中未使用模块的prod
(或任何其他冲突名称)即可。但是,由于上述原因,不建议这种做法。
[1] Metcalf,M,Reid,J和Cohen,M。(2011)“现代Fortran的解释”(牛津大学出版社)
[2] https://www.tutorialspoint.com/python/python_modules.htm