为什么R和Python中加载包的默认命名空间行为不同?

时间:2017-06-10 07:25:48

标签: python r namespaces

在Python中,使用默认行为,如果要从加载的包fun中使用函数package,则在调用它时必须将其指定为属于某个新的/不同的命名空间,即package.fun()。如果你已安装但未加载包,则根本无法调用该功能(据我所知)。

在R中,使用默认行为,如果要使用加载包fun中的函数package,则可以使用全局命名空间而不会出现任何问题,即fun()调用{{ 1}}。如果软件包已安装但未加载,您可以仍然通过指定新的/不同的名称空间来调用它,即fun

问题:如果管理已安装软件包中的命名空间的一种方法比另一种更好,那么为什么两种编程语言都不会使用相同的默认行为?

我看过很多人都说默认的Python命名空间行为很棒,但我从未见过有人使用R感觉有必要捍卫R的默认行为,即使它与默认行为有很大不同Python应该很棒。

可能不同之处在于没有CRAN的Python版本?作为初学者,我真的不知道这是如何相关的,但CRAN至少与包装有关。虽然我认为并非所有Roc包都在CRAN上也可以使用Bioconductor。

示例:更具体的例子:在Python中

package::fun()

有效,但不是

import numpy
numpy.array()

,也不

import numpy array()

作品。

在R中,两者

numpy.array()

library(ggplot2)
 ggplot()

的工作。

1 个答案:

答案 0 :(得分:1)

不同的语言表现不同,没有“最好的”#34;所有语言的行为,因为上下文(一致性,传统,最少惊讶的原则)很重要。 Python只是与其哲学(和实际事实)一致,即一切都是一个对象。模块是一个对象。如果要访问对象的属性,请使用点表示法。如果找不到某个对象(在您没有numpy的第三个import numpy示例中),则会得到一个NameError,这也是您对一致行为的期望。