在变量名中使用Unicode字符是否不好?[关闭]


82

我最近尝试对Python 3实现排名算法AllegSkill。

这是数学的样子:

替代文字

不完全是。

这就是我写的:

t = (µw-µl)/c  # those are used in
e = ε/c        # multiple places.
σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

我实际上以为Python 3不幸的是不接受²作为变量名。

>>> √ = lambda x: x**.5
  File "<stdin>", line 1
    √ = lambda x: x**.5
      ^
SyntaxError: invalid character in identifier

我会发疯吗?我应该求助于仅ASCII版本吗?为什么?上面的仅ASCII版本难于验证与公式的等效性吗?

请注意,我了解一些Unicode字形看起来非常相似,而有些像(或者是▗▖)或like在书面代码中毫无意义。但是,数学或箭头字形几乎不是这种情况。


对于每个请求,仅ASCII版本将类似于以下内容:

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

...算法的每个步骤。


58
那太疯狂了,完全不可读并且难以言喻的酷。
Dominique McDonnell


3
我发现Python不接受算术运算作为变量是一件非常好的事情。平方根符号应表示取平方根的运算,并且不能为变量。
David Thornley,2010年

4
@ David,Python中没有这种区别。事实上,sqrt = lambda x: x**.5让我一个功能(更准确地说,是一个可调用的) sqrt(2) => 1.41421356237
badp 2010年

4
OutputStream.🚽;

Answers:


54

我强烈感到,仅仅替换σssigma将是愚蠢的,濒临脑死亡。

潜在的收益是什么?好吧,走着瞧 …

  • 它会提高可读性吗?不,一点也不。如果是这样,那么原始公式无疑也将使用拉丁字母。

  • 它会改善可写性吗?乍一看,是的。但是第二,没有。因为这个公式永远不会改变(嗯,“永远”)。通常,无需更改代码,也无需使用这些变量进行扩展。因此,可写性-仅此一次-不是问题。

就个人而言,我认为编程语言比数学公式具有一个优势:您可以使用有意义的表达性标识符。在数学中,通常不是这种情况,因此我们求助于一个字母的变量,有时使它们成为希腊文。

但是希腊语不是问题。非描述性的一个字母的标识符是。

因此,要么保留原始符号……毕竟,如果编程语言确实在标识符支持Unicode,那么就没有技术上的障碍。或使用有意义的标识符。不要只用拉丁字形替换希腊字形。或阿拉伯文或印地文。


3
即使编程语言支持使用某些工具,某些工具也无法读取unicode字符。我不会说使用非unicode变量名是一个明智的决定,而且在您发表文章2.5年后,这仍然成立。
加里·S·韦弗

44
@Gary“某些工具无法读取Unicode” –因此,对工具进行更改会很垃圾。抱歉,现在是2013年,我对这种工具的同情为零,甚至没有耐心。过多地使用有缺陷的工具会阻止进度。
Konrad Rudolph

3
@KonradRudolph我的观点是,某些工具不支持并且出于某种原因不能支持Unicode,因此“更改工具”并不总是正确的答案。我同意Unicode是好的,并且工具应该理解它,但这并不总是一种选择。

3
@John我认为“更改工具”是一个适当的答案。您的示例特别说明了这种情况:Java .properties文件解析起来很简单。如果您确实碰巧使用了一个以.properties文件为后盾,不支持Unicode的工具链,则删除该工具链是完全合理的(然后自己替换它,找到替代方法,或者在最坏的情况下委托一个) )。当然,这不适用于旧系统。但是对于传统系统,最佳实践的考虑都没有。
康拉德·鲁道夫2014年

8
您谈到的这些“互换”问题似乎主要是Java和Windows开发人员的问题。十年前,大多数Linux世界都在UTF-8上进行了标准化。这绝对是一个工具链问题。停止使用不良工具。
Rich remer 2014年

33

就个人而言,我不希望看到必须调出字符映射表才能再次键入的代码。即使unicode紧密匹配算法中的内容,也确实损害了可读性和编辑能力。一些编辑器甚至可能没有支持该字符的字体。

那有什么替代方案,只需要掌握//µ = u并用ascii编写所有内容呢?


14
顺便说一句,不要以为所有键盘都能舒适地暴露标准编码键。我的键盘布局需要三个键来键入{}(在ttys btw中失败)并且完全缺少`~...如果我不使用自定义键映射,那么任何Bash脚本怎么都不需要我使用字符映射表?:)
badp

4
我在本机键盘旁边安装了希腊键盘,只需按一个键就可以在它们之间切换。这在谈论IM / email上的数学运算时很有用...,我已经想到在python脚本中使用它。
liori

18
啊。只是用简单的字母替换希腊字母?毫无收获。使用有意义的变量名称,或坚持使用论文中的名称。没有创造力的理由。
康拉德·鲁道夫

12
只是不要混淆µ和µ ...
endolith 2011年

4
合理的编辑器对于Unicode具有合理的输入方法,这使编辑这样的代码变得容易。例如,Emacs支持(其中包括)TeXrfc1345TeX听起来就是这样;它可以让你输入\sigmaσ\torfc1345给您一些&s*for σ&->for的组合。根据经验,我不担心使用比Emacs功能更弱的编辑器来容纳程序员。
Tikhon Jelvis

31

此参数假定您在键入Unicode或阅读希腊字母时都没有问题

这是争论:您想要pi还是circular_ratio?

在这种情况下,我更喜欢pi,而不是circular_ratio,因为自从我上小学以来就已经了解了pi,并且可以期望pi的定义已经深深扎根于每个值得他精打细算的程序员。因此,我不介意键入π来表示circular_ratio。

但是,那

winner_sigma_new = ( winner_sigma ** 2 *
                    ( 1 -
                     ( winner_sigma ** 2 -
                       general_uncertainty ** 2
                     ) * Wwin(t,e)
                    ) + dynamics ** 2
                   )**.5

要么

σw_new = (σw**2 * (1 - (σw**2)/(c**2)*Wwin(t, e)) + γ**2)**.5

对我来说,这两个版本都是不透明的,就像pi还是以前一样π只是我在小学时没有学过这个公式。winner_sigmaWwin对我毫无意义,或其他任何人读取代码,并使用既σw不会使它更好。

因此,使用描述性的名称,例如total_scorewinning_ratio等会增加可读性比使用更好的ASCII名称,仅仅发音希腊字母。问题不是我无法阅读希腊字母,但我无法将字符(无论是否问候)与变量的“含义”相关联。

评论时,您当然可以理解问题You should have seen the paper. It's just eight pages...。问题是,如果您将变量命名基于纸张,那么该纸张命名是为了简洁而不是可读性(无论它们是否希腊语)而选择单个字母的名称,那么人们将不得不阅读纸张才能将字母与字母相关联。 “含义”; 这意味着您为人们理解您的代码设置了人为的障碍,这总是一件坏事。

即使当您生活在仅ASCII的世界中时,三角形区域公式的a * b / 2alpha * beta / 2也都是不透明的height * base / 2。随着公式复杂度的增加,使用单字母变量的不可读性呈指数增长,AllegSkill公式当然不是一个琐碎的公式。

不管是希腊字母还是ascii单字母,单字母变量都只能作为简单的循环计数器使用,我不在乎;其他变量不应仅由单个字母组成。我不在乎您是否使用希腊字母作为名称,但是当您使用它们时,请确保我可以将这些名称与“含义”相关联,而无需阅读其他地方的任意论文。

在读小学时,我绝对不会介意使用诸如+,-,×,÷等符号表示基本算术的数学表达式,而√()将是平方根函数。小学毕业后,我不介意添加一个闪亮的新符号:∫用于整合。注意趋势,这些都是运算符。与变量名相比,运算符的使用率要高得多,但是它们以完全不同的含义被重用的频率较小(在数学家重用运算符的情况下,新含义通常仍具有旧含义的一些基本属性;情况并非如此)重用变量名时)。

总之,不,使用Unicode字符作为变量名也不错。但是,使用单字母名称作为变量名称总是很糟糕,并且允许使用Unicode名称不是使用单字母变量名称的许可。


9
老实说,即使我使用error_on_measured_skill_with_99th_percent_confidence而不是,这里的公式也没有多大意义sigma
badp 2010年

4
@badp:长名字!=好名字。不过,在某些情况下,您无法选择一个好名字(例如,当您仅了解公式时,却不完全理解公式的各个部分所做的事情(需要完全不同的理解水平)),那么在这种情况下,第二种最佳选择是用一些评论掩盖您的屁股(比将其发送给外部论文更好)。添加一个数据字典来解释变量名指的是什么,例如// σw = skill level measurement error,等等
Lie Ryan 2010年

1
@badp:说实话,仅凭这些信息,sigma就是某种软糖(可以这么说),相对于sigma而言,它使我对公式有了更好的理解。当公式难以理解时,您不想在其顶部添加更多的不透明性。
Lie Ryan

2
是。这个。不幸的是,我在写答案时忽略了它。
康拉德·鲁道夫

3
嗯,从事与统计相关的任何事情的人都知道σ表示“标准偏差”。这是该领域中非常知名的标准符号。
TRiG 2012年

14

你懂代码吗?还有其他需要阅读的人吗?如果是这样,那没有问题。

我个人很高兴看到纯ASCII源代码的背面。


做完了 (我假设最后一行是您要查看代码的纯ASCII版本吗?)[](http://〜)
badp 2010年

4
@badp:不,是我要查看仅ASCII代码的死亡。

直到您开始看到在Windows 1252系统上登陆时Unicode源文件发生了什么……

1
@Thorbjørn:如果它们包含BOM,那么希望什么都不会发生。

9

是的,您失去了理智。我会亲自在注释中引用纸张和公式编号,然后将所有内容都以纯ASCII格式编写。这样,任何有兴趣的人都可以将代码和公式关联起来。


5
我很难确保代码和公式首先匹配 ……
badp 2010年

10
@Paul:幸运的是,Unicode已有10多年的历史了,因此反对异议得到了解决。尽管不同的UTF之间没有明确的赢家,但这不是问题:不应有一个。区分它们对于软件而言是微不足道的。
康拉德·鲁道夫

1
@康拉德:我的意思是从现在起十年后。相当多的程序仍然不支持Unicode。此外,我不同意您的断言-编写处理所有3个utf的通用反向例程并不容易。必须有明确的赢家。支持3种不同的UTF没有任何意义(让我们不要考虑仍然存在的其他代码页)。
保罗·内森

3
@Paul:您需要多久编写一次“通用反向例程”?这三个UTF具有不同的用途,我认为您永远不会如愿以偿。
Dean Harding

7
@Paul:拧紧这些程序。有足够的优秀编辑器知道如何处理Unicode。如果某些编辑人员仍然没有赶上潮流,那么让经济选择来解决这个问题。正如Dean所说,UTF有不同的用途。它们存在是一件好事。而且我在您的多个反向例程中看不到重点。您只需要编写一次(现在忽略规范化形式):对于代码点,而不是单个UTF。
康拉德·鲁道夫

5

我会说使用Unicode变量名称是一个坏主意,原因有两个:

  1. 他们是要输入的PITA。

  2. 它们通常看起来与英文字母几乎相同。这就是为什么我讨厌在数学符号中看到希腊字母的原因。尝试将p告诉rho。这并不容易。


6
取决于您用来键入它们的内容。
endlith 2011年

4

在这种情况下,我会说一个复杂的数学公式。

我可以说,在20年的时间里,我从未编写过任何复杂的代码,而希腊字母使它更接近原始数学。如果您听不懂,就不要维护它。

这样说,如果我不得不在遗赠给我的沼泽标准代码中维护µ和σ,我找出您的住所...


3
  • 优点:看起来不错
  • 缺点:Unicode字符,因此整个含义可能会在工具链(编辑器,代码格式化程序,版本控制,较旧的编译器)中丢失

您面临的风险有多大?收益大于风险吗?


2
工具链?什么工具链?
badp

2
编辑器,代码格式化程序,版本控制,较旧的编译器。每个接触您文件的工具和人员。我对将Unicode文件YMMV弄乱的工具有不好的经验。
LennyProgrammers 2010年

2

在不远的将来的某个时候,我们都会使用文本编辑器/ IDE / Web浏览器,这些文本编辑器/ IDE / Web浏览器使编写包含古典希腊字符等的编辑文本变得容易。 “我们当前使用的工具中的功能...)

但是在此之前,许多程序员很难处理程序源代码中的非ASCII字符,因此,如果您编写的应用程序可能需要由他人维护,则这是一个坏主意。

(顺便说一下,在Python标识符中可以有希腊字符但不能有平方根的原因很简单。希腊字符被归类为Unicode字母,但平方根是一个非字母;请参见http://www.python.org / dev / peps / pep-3131 /


我认为制作一个IME可以为无法直接输入字符的用户翻译字符是一个好主意。
AndrejaKo 2010年

是的,当我们切换到DVORAK时,或多或少。:(
badp 2010年

1
@AndrejaKo Linux确实有一个IME可以接受LaTeX样式的命令-也就是说,您键入\mu并插入µ
badp 2010年

@badp非常感谢!我下次启动时会尝试!
AndrejaKo 2010年

Emacs支持许多不错的输入法,使输入Unicode符号变得容易。(包括我使用的TeX。)Emacs几乎没有未来主义。(这真棒当然。)
吉洪Jelvis

2

您没有说使用什么语言/编译器,但是通常变量名的规则是它们必须以字母字符或下划线开头,并且仅包含字母数字和下划线。Unicode√将不被视为字母数字,因为它是一个数学符号而不是字母。但是,σ可能是(因为它在希腊字母中),并且á可能被视为字母数字。


1

我在StackOverflow上发布了同样的问题

我绝对认为在与数学有关的大量问题中使用unicode是值得的,因为它使直接读取公式成为可能,而使用普通ASCII则不可能。

想象一下一个调试会话:当然,您总是可以手写代码应该计算出的公式以查看其是否正确。但是百分之九十的时间,您不会打扰,并且该错误可以长时间隐藏。而且没有人愿意看这个深奥的7行纯ASCII公式。当然,使用unicode不如tex渲染的公式好,但效果更好。

使用长描述性名称的替代方法不可行,因为在数学中,如果标识符不短,则公式看起来会更加复杂(为什么您认为人们在十八世纪左右就开始用“ +”代替“ +”和“减号”旁边的“-”?)。

就个人而言,我还将使用一些下标和上标(我只是从此页面复制粘贴)。例如:(Python是否允许√作为标识符)

√ = math.sqrt #function alias
c² = c**2
σʷ² = σʷ**2
γ² = γ**2
σ′ʷ = √(σʷ² * (1 - (σʷ²/c²)*Wʷⁱⁿ(t, e)) + γ²)

我在哪里使用上标,因为unicode中没有下标等效项。(不幸的是,unicode下标字符集非常有限。我希望有一天,将unicode下标视为变音符号,即一个字符用于下标,另一个字符用于下标字母的组合)

最后一件事,我认为关于使用非ASCII字符的讨论主要是有偏见的,因为许多程序员从未处理过“公式密集的数学符号”。因此,他们认为这个问题并不重要,因为他们从未经历过需要使用非ASCII标识符的大部分代码。如果您是其中之一(我直到最近才是),请考虑以下问题:假设字母“ a”不是ASCII的一部分。然后,您将对在计算非平凡的数学公式时不使用希腊字母,下标和上标的问题有了一个很好的认识。


0

该代码仅用于您的个人项目吗?如果是这样,发疯,随便使用。

该代码供其他人使用吗?即和某种形式的开源应用程序?如果是这样,您可能只是在问麻烦,因为不同的程序员使用不同的编辑器,并且您不能确定所有编辑器都会正确支持unicode。另外,当源代码文件的类型为'd / cat'd时,并不是所有的命令外壳都能正确显示它,如果需要在html中显示它,可能会遇到问题。


0

就我个人而言,我很乐意在这种情况下将编程语言视为数学家的工具,因为我实际上并没有使用生活中看起来像这样的数学。:D当然,为什么不使用ɛ或σ或其他任何值-在这种情况下,它实际上易读。

(尽管,我不得不说,我的首选是支持上标数字作为直接方法调用,而不是变量名称。例如2²= 2 ** 2 = 4,等等。)


-2

这到底是σ什么是W,什么是εc什么是γ
您将以解释变量用途的方式命名变量。
我个人打败了那些愿意让Unicode或ASCII版本供我维护的人,尽管ASCII版本更好。

邪恶的是调用变量σor或sor sigmavalueor var1,因为它不传达任何信息。

假设您用英语编写代码(因为我相信无论您来自哪里),ASCII都足以为您的变量赋予有意义的名称,因此实际上并不需要Unicode。


2
如果他复制/粘贴了论文,然后尽管使用了一个字符变量名,却又将其作为注释的一部分,该怎么办?
布赖恩(Brian)

19
对于熟悉问题域的人来说,许多这些变量名具有很强的含义。对于熟悉域名的人来说,英文名称可能不如 sigma或rho 那样易读。
dsimcha

3
恐怕rank_error_with_99_pct_confidence有点太长了,实际上并不能使公式更容易理解。AllegSkill / TrueSkill称为那些sigma,因此,我相信保留他们拥有的特定域名对我来说是完全可以接受的。
badp 2010年

3
@badp:好名字简洁明了;但这并不一定要完全描述。对于您的sigma,使用rank_error并在文档/注释中添加有关99%置信度的额外详细信息非常好。
Lie Ryan

1
@dsimcha:我认为熟悉特定领域的人比从未听说过的人稀有得多。而且我认为,熟悉该域名的人将能够使用简单的英文名称,而如果不熟悉希腊的单字母变量,那么所有不熟悉域名的人将完全无法理解正在发生的事情。
back2dos

-2

对于具有众所周知的数学起源的变量名,这是绝对可以接受的,甚至是首选。但是,如果您希望分发代码,则应将这些值放在模块,类等中,以便IDE自动完成功能可以“键入”奇怪的字符。

在标识符中使用√或²-不多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.