我知道我的问题听起来可能很愚蠢,而且语言定义中可能有明确禁止这一概念的东西,但由于我不知道这一禁止,我想知道是否有人可以对此有所了解。简而言之,我想定义一个可以从python shell调用的python函数,但是我想避免使用括号。有些情况下,函数不需要参数,而括号似乎只表示我们正在处理函数。例如,如果要打印当前工作目录。我可以将函数定义为
def pwd():
print os.getcwd()
然后我就可以从贝壳里把它叫做
pwd()
但是如果我想要一个我可以调用的函数
pwd
这有可能吗?
Tags:
这是不可能的。一个对变量的简单引用(例如
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
来执行。我忘了你还可以做一个黑客:
现在,当您在shell中键入pwd时,它将调用
__repr__
来获取对象的字符串表示。不幸的是,由于python语言强制返回字符串(与之相反,如果实现ls,则返回表示当前目录中的文件/文件夹的字符串列表)。你会在那里找到一些语法。你可以试试这样的方法:
然后在你的解释器中运行:
相关问题 更多 >
编程相关推荐