在没有括号的情况下定义功能?

时间:2011-10-08 17:41:39

标签: python function definition

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

def pwd():
    print os.getcwd()

然后我可以从shell中调用它

pwd()

但是,如果我想要一个我可以称之为

的功能,该怎么办?
pwd

这有可能吗?

3 个答案:

答案 0 :(得分:10)

如果不修改语言或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操作1}}。

我忘记了你可以做的黑客攻击:

action

现在,当您在shell中键入pwd时,它将调用class Pwd(object): def __repr__(self): # do pwd command # return result in string form pwd = Pwd() 来获取对象的字符串表示形式。不幸的是,你只能返回一个字符串(相反,如果你正在实现ls,则表示当前目录中文件/文件夹的字符串列表),因为python语言会强制执行此操作。

答案 1 :(得分:8)

你会在某处获得一些语法。你可以尝试类似的东西:

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

然后在你的翻译中,运行:

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

答案 2 :(得分:4)

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

现在,这不适用于对象的属性(即任何东西),因为获取成员在技术上已经是函数调用,并且可以被覆盖。实际上有很多方法可以影响obj.member评估的内容,最重要的方法是描述符中的__getattr____getattribute____get__。对于后两者,存在设置属性的等价物(是的,这是一个不同的操作)。所有这些都记录在language reference

使用它来隐式调用一个过程(而不是getter)仍然是一个非常糟糕的主意,因为它反直觉,使代码不那么明显,除了节省两个parens之外绝对没有任何好处。它也不允许获得对该函数的引用,这使得函数和功能启发的编程非常不方便(你可以使用lambda: obj.pwd,但这更不明显和更丑陋)。 / p>