os.chdir("/path2") >ls >"/path1" ( the wa-6ren">
gpt4 book ai didi

python - 通过变量或在python中不带括号调用函数

转载 作者:行者123 更新时间:2023-11-28 22:39:00 26 4
gpt4 key购买 nike

我想创建一个别名来调用不带括号的函数。像这样的东西:

>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()

但是不工作。我怎么能做这件事?这是可能的? (只要容易做到)

最佳答案

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

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

也就是说,除非你 Hook 回显机制。您可以通过覆盖 __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.

关于python - 通过变量或在python中不带括号调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35199556/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com