【问题标题】:Why does python disallow usage of hyphens within function and variable names?为什么 python 不允许在函数名和变量名中使用连字符?
【发布时间】:2010-01-14 13:27:44
【问题描述】:

我一直想知道为什么python中的函数名和变量名之间不能使用连字符

尝试过 Lisp 和 Clojure 等允许使用连字符的函数式编程语言。为什么 python 不这样做。

# This won't work -- SyntaxError
def is-even(num):
    return num % 2

# This will work
def is_even(num):
    return num % 2

我确信 Guido 爵士一定是因为某些原因才这么做的。我用谷歌搜索但无法找到答案。任何人都可以对此有所了解吗?

【问题讨论】:

  • 发生语法错误是因为is 是关键字。在def mightbe-even(num) 中,语法错误可能是因为连字符。
  • 我一直想知道为什么 ASCII 有“-”和“”。当您想知道“-”的用途时,您是否也想知道“”的用途?确实,我有很多标点符号问题和这个一样重要。为什么“#”和“♯”不一样?你也想知道吗?我一直觉得奇怪的是我们不能使用“♯”来表示 cmets。
  • (@aatifh,请参阅meta.stackexchange.com/questions/35582/… -- 您是否将标签从 pyhon 更改为 python?也许还删除了标题中的尾随反引号?)
  • @Arjan 是的,我做到了。我在发布标签不正确的问题后 5 分钟内意识到。但没有编辑标题。
  • @S.Lott 对于我的问题,答案非常直接和简单。只是我们需要了解 sexp 和 Infix 符号之间的区别。看到答案后我意识到了这一点。

标签: python


【解决方案1】:

因为连字符用作减法运算符。想象一下你可以有一个is-even函数,然后你有这样的代码:

my_var = is-even(another_var)

is-even(another_var) 是对函数is-even 的调用,还是从名为is 的变量中减去函数even 的结果?

Lisp 方言没有这个问题,因为它们使用前缀表示法。例如,有明显的区别

(is-even 4)

(- is (even 4))

在 Lisps 中。

【讨论】:

  • 对于 Lisp,前缀方面是无关紧要的;不同之处在于“-”不一定被视为单独的标记;字母和“普通”标点符号(例如不是“)”)的任何组合都可以组成一个标记。中缀语言可以很好地配合这样的规则;那么“is-even(another_var)”将是一个函数调用,“is - even(another_var)”将是减法,就像在 Lisps 中 (is - even 4) 是与 (is-even 4) 不同的 s 表达式。
  • Lisp 没有这个问题,因为“-”只是一个字符。
  • 我可以看到 '-' 应该用于减号运算符,并且中缀表示法有利于可读性(对于那些没有使用前缀表示法计算器长大的人)。但是,是否有令人信服的理由允许在减号和其他运算符周围没有空格?既然空格在 Python 中已经很重要了,为什么不强制在运算符周围使用空格,这将允许在名称中使用连字符,在我看来,这比 under_score 和 camelWTFCase 更具可读性和更容易键入约定,我等量不喜欢。
  • “Lisp 方言没有这个问题,因为它们使用前缀表示法。”——Dylan 是中缀并在变量名中使用连字符。
【解决方案2】:

因为 Python 使用中缀表示法来表示计算,并且连字符和减号具有完全相同的 ascii 代码。您可以有模棱两可的情况,例如:

a-b = 10
a = 1
b = 1

c = a-b

答案是什么? 0 还是 10?

【讨论】:

  • 我得到了这个。看起来很直。任何具有中缀符号的语言都不能使用连字符。只有在支持 S 表达式的语言中才允许使用连字符。 :)
  • 好吧,一种自己的字符集是 Unicode 的编程语言(它们即将到来)可以很容易地区分连字符和减号。问题是太多的语言在它们的字符集中无法区分连字符和减号。这是字符集的贫乏,而不是可表达性的贫乏。
  • 你是对的,但如果有人利用它并在他们的标识符中使用它,这种能力会很糟糕。
  • 伙计,我不想在调试时在视觉上区分 ...
  • @bobince 这两个字符看起来就像-(连字符)和(短划线)一样容易区分。很容易。 (当某人应该在散文中使用破折号时,人们总是可以看到他们何时滥用连字符。)尽管我不建议将任何人置于连字符或减号可能被误认为彼此的情况下,因为文本编辑器倾向于使用等宽字体。
【解决方案3】:

因为它会使解析器更加复杂。程序员也会感到困惑。

考虑def is-even(num)::现在,如果is 是一个全局变量,会发生什么?

另请注意,- 是 Python 中的减法运算符,因此会使解析更加复杂。

【讨论】:

  • 如何让解析变得更复杂?这里有两条规则: (1) 中缀运算符被一个或多个空格包围; (2) 中缀运算符被零个或多个空格包围。第二条规则是否比第一条规则复杂得多?
【解决方案4】:
is-even(num)

包含连字符 ?我认为这是函数返回值的减法,即使参数 num 从 is 的值中减去。

正如@jdupont 所说,解析可能很棘手。

【讨论】:

  • is 是关键字,不能有值:)
  • 解析可能很棘手。从关键字中减去一个值可能会导致解析器抱怨。
【解决方案5】:

奇怪的是,使用 setattr() 可以使类变量名称带有连字符,而不是您想要的。这是一个例子:

class testclass:
    pass

x = testclass()
setattr(x, "is-even", True)
getattr(x, "is-even")
True

这仍然失败:

x.is-even
File "<stdin>", line 1
  x.is-even
     ^
SyntaxError: invalid syntax

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多