定义没有括号的函数?

2024-06-16 15:02:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

def pwd():
    print os.getcwd()

然后我就可以从贝壳里把它叫做

pwd()

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

pwd

这有可能吗?


Tags: 函数目录语言概念参数定义osdef
3条回答

这是不可能的。一个对变量的简单引用(例如pwd)不会做任何特殊的事情,它只是检索存储在该变量中的引用。如果该变量绑定到函数,则此引用是对函数的引用,但无论哪种方式,它都只是引用,仅此而已。要真正调用任何东西,必须使用函数调用的语法-expression '(' arglist ')'

现在,这不适用于对象的属性(即任何对象的属性),因为从技术上讲,获取成员已经是一个函数调用,并且可以被重写。实际上,有很多方法可以影响obj.member的计算结果,最重要的方法是在描述符中__getattr____getattribute____get__。对于后两种情况,有相当于设置属性(是的,这是一个不同的操作)。所有这些都记录在language reference中。

使用这个来隐式调用过程(与getter相反)仍然是一个非常糟糕的主意,因为这是违反直觉的,会使代码不那么明显,除了保存两个paren之外,绝对没有任何好处。它也不允许获得对函数的引用,这使得函数式和函数式的编程非常不方便(您可以使用lambda: obj.pwd,但这更不明显和丑陋)。

如果不修改语言或shell,则无法执行此操作。

如果您想使用Python作为shell,您应该真正尝试IPython,它允许您定义宏,而无需键入太多键即可使用这些宏。它还允许您执行!pwd,您还可以将其分配给变量x = !pwd。它甚至允许您通过编写f x而不是f(x)来调用单参数函数。

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

我忘了你还可以做一个黑客:

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

现在,当您在shell中键入pwd时,它将调用__repr__来获取对象的字符串表示。不幸的是,由于python语言强制返回字符串(与之相反,如果实现ls,则返回表示当前目录中的文件/文件夹的字符串列表)。

你会在那里找到一些语法。你可以试试这样的方法:

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

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

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

相关问题 更多 >