不使用括号定义函数?

12

我知道我的问题可能听起来很愚蠢,也许语言定义中明确禁止这种概念,但由于我不知道这个禁令,所以我想知道是否有人可以解释一下。简而言之,我想定义一个Python函数,我可以从Python shell中调用它,但我想避免使用括号。有些情况下,函数不需要参数,此时括号只是表示我们正在处理一个函数。例如,如果想要打印当前工作目录,我可以定义一个函数如下:

def pwd():
    print os.getcwd()

然后我可以从 shell 中调用它:

pwd()

但是如果我想要一个可以调用的函数怎么办?

pwd

这个有可能吗?


4
我对这里的某些 XY 感到怀疑;你为什么对此感兴趣?(猜测一下)你想制作一个用户界面吗?如果是,可以查阅cmd模块。 - Thomas
1
我觉得你要找的是Ruby! - bioneuralnet
你的怀疑基本上是正确的。我想要一个带有一些我经常使用的函数的Python解释器。虽然你可以说pwd和pwd()之间没有太大的区别,但事实是,括号在键盘上的位置非常奇怪,这取决于你使用的语言... - v923z
3个回答

11

你总会在代码中遇到一些语法问题。你可以尝试像这样的方式:

import os
class Shell(object):
    @property
    def pwd(self):
        print os.getcwd()

然后在您的解释器中运行:

>>> s = Shell()
>>> s.pwd
/tmp

11

如果不修改语言或shell,你无法做到这一点。

如果你想将Python用作shell,你应该真的尝试IPython,它允许你定义宏,可以在不键入太多键时使用。它甚至可以执行!pwd,你还可以将其赋值给一个变量x =! pwd。它甚至让你通过写f x而不是f(x)调用单参数函数。

顺便说一句,Haskell是一种使用空格表示参数列表的语言,即:在Python中,f(1,2,3)将变为Haskell中的f 1 2 3,而在shell中,任何IO操作都可以通过只键入action来执行。

我忘记了还有一个hack:

class Pwd(object):
    def __repr__(self):
        # do pwd command
        # return result in string form
pwd = Pwd()

现在当你在shell中键入pwd时,它会调用__repr__来获取对象的字符串表示形式。不幸的是,你只能返回一个字符串(而不是比如说文件夹/文件列表的字符串列表,如果你要实现ls),因为Python语言强制这样。


感谢所有的回复!所以,共识是虽然原则上可以做到,但完全不建议这样做。好的,谢谢,Zoltán - v923z

4
这是不可能的。对于一个变量的裸引用(例如 pwd),它没有任何特殊的功能,只是检索存储在该变量中的引用。如果将该变量绑定到函数,则此引用是对函数的引用,但无论如何,它只是一个引用,仅此而已。要实际调用任何内容,您必须使用函数调用的语法 - expression '(' arglist ')'
现在,这并不适用于对象的属性(即任何东西的属性),因为获取成员在技术上已经是一个函数调用,并且可以被覆盖。实际上有许多方法可以影响 obj.member 的求值结果,其中最重要的是 __getattr____getattribute__ 和描述符中的 __get__。对于后两者,有设置属性的等效方法(是的,那是一个独立的操作)。所有这些都记录在语言参考中。
尽管如此,使用这种方式隐式调用过程(而不是getter)仍然是一个非常糟糕的想法,因为它很反直觉,使代码不太明显,除了节省两个括号之外,没有任何好处。它还将禁止获取对函数的引用,这使得使用它进行函数式和类函数式编程非常不方便(您可以使用 lambda: obj.pwd,但那甚至更不明显和更丑陋)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接