【问题标题】:Defining function without the brackets?定义没有括号的函数?
【发布时间】:2011-10-08 17:41:39
【问题描述】:

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

def pwd():
    print os.getcwd()

然后我可以从 shell 调用它为

pwd()

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

pwd

这可能吗?

【问题讨论】:

  • 我怀疑这里有一些 XY;你为什么有兴趣这样做? (冒险一个完整的猜测)你想做一个用户界面吗?如果是这样,请查看 cmd 模块。
  • 我想你要找的东西叫 Ruby!
  • 嗯,你的怀疑或多或少是正确的。我想要一个带有一些我经常使用的函数的 python 解释器。虽然您可以说 pwd 和 pwd() 之间没有太大区别,但事实是括号位于键盘上非常奇怪的位置,具体取决于您使用的语言......跨度>

标签: python function definition


【解决方案1】:

你会在某处得到一些语法。您可以尝试以下方法:

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

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

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

【讨论】:

    【解决方案2】:

    如果不修改语言或外壳,您将无法做到这一点。

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

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

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

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

    现在,当您在 shell 中键入 pwd 时,它将调用 __repr__ 来获取对象的字符串表示形式。不幸的是,您只能返回一个字符串(如果您正在实现 ls,那么您只能返回一个字符串(而不是表示当前目录中的文件/文件夹的字符串列表),因为 Python 语言会强制执行此操作。

    【讨论】:

    • 感谢所有回复!因此,共识是,虽然原则上可以这样做,但根本不建议这样做。很公平。干杯,佐尔坦
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-11-13
      • 1970-01-01
      • 2016-10-08
      • 2022-01-19
      • 1970-01-01
      • 2018-10-14
      • 2013-08-22
      • 1970-01-01
      相关资源
      最近更新 更多