我一直想知道为什么我们不能在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
我确信圭多爵士一定是因为某些原因而这样做了。我用Google搜索但无法找到答案。任何人都可以对此有所了解吗?
答案 0 :(得分:41)
因为连字符用作减法运算符。想象一下,你可以拥有is-even
函数,然后你有这样的代码:
my_var = is-even(another_var)
是is-even(another_var)
调用函数is-even
,还是从名为even
的变量中减去函数is
的结果?
Lisp方言没有这个问题,因为它们使用前缀表示法。例如,
之间存在明显差异(is-even 4)
和
(- is (even 4))
在Lisps中。
答案 1 :(得分:9)
因为Python使用中缀表示法来表示计算,连字符和减号具有完全相同的ascii代码。您可以有不明确的案例,例如:
a-b = 10
a = 1
b = 1
c = a-b
答案是什么? 0或10?
答案 2 :(得分:7)
因为它会使解析器更复杂。程序员也会感到困惑。
考虑def is-even(num):
:现在,如果is
是全局变量,会发生什么?
另请注意,-
是Python中的减法运算符,因此会进一步使解析复杂化。
答案 3 :(得分:0)
is-even(num)
包含连字符?我认为这是函数返回的值的减法,即使参数num是来自is。
正如@jdupont所说,解析可能很棘手。
标记
答案 4 :(得分:0)
奇怪的是,使用 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