在python中

时间:2016-02-04 11:15:13

标签: python python-3.x

我想创建一个别名来调用没有圆括号的函数。类似的东西:

>ls=os.getcwd()
>ls
>"/path1"
>os.chdir("/path2")
>ls
>"/path1"  ( the wanted output would be "/path2" )

确实" ls"总是有相同的价值,在分配时刻的价值。

我当然能做到:

>ls=os.getcwd

然后用

打电话
>ls() 

但我想要的是调用没有括号的函数(当然,当函数不需要参数时)

我试过

>def ListDir():
> print(os.getcwd())
>
>ls=ListDir()

但是不能工作。我怎么能这样做?它有可能吗? (只有这很容易)

1 个答案:

答案 0 :(得分:4)

Python更喜欢你是明确的;如果你想重新计算一个表达式,你来调用它。但是如果你真的想让它在Python交互式解释器中工作,你就必须破解它。

您只是回显变量,而不是执行表达式。变量不会因为你要求交互式解释器回应它而改变。

也就是说,除非你挂钩回声机制。您可以覆盖__repr__ method

class EvaluatingName(object):
    def __init__(self, callable):
        self._callable = callable
    def __call__(self):
        return self._callable()
    def __repr__(self):
        return repr(self())

ls = EvaluatingName(os.getcwd)

演示:

>>> import os
>>> class EvaluatingName(object):
...     def __init__(self, callable):
...         self._callable = callable
...     def __call__(self):
...         return self._callable()
...     def __repr__(self):
...         return repr(self())
...
>>> ls = EvaluatingName(os.getcwd)
>>> os.chdir('/')
>>> ls
'/'
>>> os.chdir('/tmp')
>>> ls
'/private/tmp'

这现在有效,因为每次表达式产生的值不是None时,该值都会被回显,并在对象上回显调用repr()

请注意,此在交互式解释器或打印之外无效。在其他上下文(例如,脚本)中,您可能每次都必须将对象转换为字符串。例如,您不能将它用作需要字符串的函数的参数。

这将有效:

os.path.join(ls(), 'foo.txt')  # produce the value first

但是不会

os.path.join(ls, 'foo.txt')    # throws an AttributeError.