我想创建一个别名来调用没有圆括号的函数。类似的东西:
>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()
但是不能工作。我怎么能这样做?它有可能吗? (只有这很容易)
答案 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.