我正在尝试计算proc所属的包,以便我可以验证包版本
说我有包
some::package 1.0
哪个有proc
some::package::some_proc
给出一些:: package :: some_proc我希望能够获得1.0
我无法保证名称空间与其所属的包名称相同
任何帮助非常感谢
答案 0 :(得分:2)
从技术上讲,如果不提供自己的package require
版本,就无法做到这一点。 Tcl中的命名空间和包和文件没有链接,就像它们是Python或Java一样。
如果您知道所有过程都是静态定义的(例如没有动态代码生成),您可以用您自己的版本替换package require
并在调用之前和之后枚举所有过程并将名称放在某个注册表中。< / p>
你想要验证什么?
如果要验证某种API,可以查看Tcllib中的pluginmgr包。
答案 1 :(得分:0)
您正在寻找namespace current
:
% namespace eval some::package {
proc some_proc {} { puts [namespace current] }
}
% some::package::some_proc
::some::package
答案 2 :(得分:0)
按照惯例,不是普遍的,您可以从包含相关命令的命名空间名称中获取包的名称:
set pkg [namespace qualifiers [namespace which $theCommand]]
# Be aware, this produces the empty string for global commands
然而,并非所有包都这样做;一些较旧的包不会将其公共命令放入命名空间(出于历史/反向兼容性原因)。在这种情况下,搜索文档是你唯一能做的事情。
获得软件包名称后,您可以使用package present
确定当前加载的软件包版本:
set version [package present $pkg]
这仅适用于包装先前为package require
d的情况。您还可以使用package versions
确定您的环境中可用的其他版本的软件包;虽然Tcl只会将一个版本的软件包加载到解释器上下文中,但您可以安装许多不同版本而不必(必然)出现问题。