关于python:在解释语言中使用匈牙利符号前缀有意义吗?

Does it make sense to use Hungarian notation prefixes in interpreted languages?

首先,为了避免重复的问题,我看了下面的文章。

https://stackoverflow.com/questions/1184717/hungarian-notation/匈牙利语为什么我不应该使用"匈牙利符号"?变量前缀("匈牙利符号")是否真的需要?人们在现实世界中使用匈牙利命名约定吗?

现在,所有这些帖子都与C语言、C++、Java强类型语言有关。我确实理解,在编译前已知类型时,不需要前缀。不过,我的问题是:

考虑到在运行时之前看不到对象的类型,在基于解释器的语言中使用前缀是否值得?

编辑:如果有人能把这篇文章变成社区维基,请这样做。我对这篇文章的声誉(或负面声誉)几乎不感兴趣。


这取决于您所指的两个版本中的哪一个:

  • 如果要使用"real",则使用匈牙利原始符号aka applications匈牙利符号,表示逻辑变量类型resp。它的目的,请随意这样做。

  • "被误解"的版本,也就是系统匈牙利表示法,只表示物理变量类型是不允许使用的。


imho,使用系统匈牙利语(在数据类型前加前缀)从来没有意义。您可以使用静态语言或动态语言,但编译器或解释器都会处理类型系统。通过变量名来注释变量类型只能导致歧义(例如,想象一个名为intSomething的浮点)。

在应用匈牙利语方面,它是完全不同的,即使用某种使用模式进行前缀。我认为使用这种表示法是一种良好的实践,例如"usvalue"表示不安全(即未验证)的值。这提供了一个关于用法的视觉提示,并防止您混合使用不同类型但不打算一起使用的变量(或者当它们打算一起使用时,您至少对正在使用的内容有了一个概念,它们会在代码检查雷达上产生一个点)。

我经常在matlab中使用这样的东西,例如idxInterest来表示double数组不是原始数据值,而是以某种方式感兴趣的索引(进入另一个数组)。我经常使用selInterest(selfrom select)对逻辑索引进行相同的处理(我同意这看起来像是边界系统匈牙利语),但在许多情况下,这两种方法都可以在相同的上下文中使用。

同样,对于迭代器:我经常使用多维数组(例如4d),在奇数情况下,我在维度上运行(par)for,迭代器称为iFoojBarkBaz……虽然它们的上限一般是nFoonBarnBaz……(或numFoo…)。当执行更复杂的索引操作时,您可以很容易地看到哪个索引属于哪个维度(通过前缀,您知道使用的是什么数字维度,通过全名,您知道该维度代表什么)。这使得代码更加可读。

除此之外,我经常使用dFoo=1;dBar=2;……表示某一组变量的维数。这样,您就可以很容易地看到,像meanIncome = mean(income, dBar)这样的东西在Bar上取了平均值income,而meanIncome = mean(income, 2)不传递相同的信息。由于您还必须设置d变量,因此它还可以作为变量的文档。

虽然在技术上做iFoo + jBarkBaz + dBar这样的事情并不是不正确的,但当代码中确实出现这些问题时,它确实会引发一些问题,并且它们允许您更警惕地检查该部分。这就是真正的(应用)匈牙利符号的意义所在。

(*)唯一有意义的时刻是,您的完整框架/语言要求您使用它。例如,win32 api使用它,因此当您直接与之交互时,您应该使用这些标准来将混淆降到最低。然而,我认为寻找另一种框架/语言可能同样有意义,甚至更有意义。

请注意,这与Perl中使用的sigils、一些基本方言等不同。它们也传递类型,但在许多实现中,这是类型定义,因此不可能有或很少的歧义。另外一个问题是,使用这种类型声明是否是一种良好的实践(我不确定自己在这方面的立场)。


在python中不赞成匈牙利符号传送类型("Systems Hungarian")的原因很简单。这是误导。一个变量可能被称为iPhones(电话的整数,可能是:-),但是因为它是python,所以除了一个整数之外,没有什么可以阻止你将它放入其中!也许你会发现你出于某种原因需要这么做。然后,所有使用它的代码对于试图理解它的人来说都是非常误导的,当然,除非您全局更改了变量的名称。

这种表示法的目的是帮助您跟踪静态类型语言中的变量类型,并且在一段时间内可以说是有用的。但是现在它已经过时了,即使对于静态类型的语言,考虑到IDES的可用性,它可以以更好的方式完成工作。


正如它被提出的,匈牙利符号是一个合理的想法。当它被应用时?它应该在轨道上被撞击(这是唯一可以确定的方法)。


您链接到的第一个问题的公认答案同样适用于python:

Hungarian notation has no place in Java. The Java API does not use it, and neither do most developers. Java code would not look like Java using it.

所有这些对于Python也是一样的。