在调用函数时将变量内联设置为参数值

Setting a variable to a parameter value inline when calling a function

提问人:CryptoFool 提问时间:3/1/2022 最后编辑:BrokenBenchmarkCryptoFool 更新时间:3/1/2022 访问量:488

问:

在其他语言中,比如 Java,你可以做这样的事情:

String path;
if (exists(path = "/some/path"))
    my_path = path;

关键是作为指定方法调用参数的一部分进行设置。我知道这在 Python 中不起作用。这是我一直希望 Python 拥有的东西。path

有什么方法可以在 Python 中实现这一点吗?我在这里所说的“完成”是指能够将调用和赋值都写成一个语句,而不需要事先支持代码。existspath

如果一种方法需要使用对函数或方法的额外调用,包括我自己编写的任何内容,我都可以接受。我花了一点时间试图想出这样一个模块,但没能想出任何比在调用函数之前做赋值更丑陋的东西。

更新:如果可以假设 Python 3.8 或更高版本,@BrokenBenchmark的答案是完美的。不幸的是,我还不能这样做,所以我仍在寻找适用于 Python 3.7 及更早版本的这个问题的解决方案。

python 赋值运算符 方法调用

评论


答:

2赞 BrokenBenchmark 3/1/2022 #1

是的,如果您使用的是 Python 3.8 或更高版本,则可以使用 walrus 运算符

import os
if os.path.isdir((path := "/some/path")):
    my_path = path

评论

0赞 CryptoFool 3/1/2022
好!不幸的是,我的代码还不能假设 3.8+。因此,我需要坚持使用适用于 3.7- 的解决方案。但这和我正在寻找的完全一样。- 哦,顺便说一句,为什么要额外的parens?我认为这些没有必要。
0赞 Mous 3/1/2022
你是对的,在这种情况下不需要额外的 parens,但 walrus 在解析方面有点奇怪,所以在它周围包含 parens 通常是一个好主意,尤其是在列表推导式等语句中。
0赞 CryptoFool 3/1/2022
凉。我会牢记这一点。
0赞 BrokenBenchmark 3/1/2022
不幸的是,我不相信在 Python 3.8 之前有什么。
1赞 CryptoFool 3/1/2022 #2

我想出了一些问题,但从技术上讲确实让我到达了我想要的地方。也许其他人会有一些想法来改进它,让它变得非常酷。这是我所拥有的:

# In a utility module somewhere

def v(varname, arg=None):
    if arg is not None:
        if not hasattr(v, 'vals'):
            v.vals = {}
        v.vals[varname] = arg
    return v.vals[varname]

# At point of use

if os.path.exists(v('path1', os.path.expanduser('~/.harmony/mnt/fetch_devqa'))):
    fetch_devqa_path = v('path1')

正如你所看到的,这符合我没有额外代码行的要求。在此示例中,涉及的“变量”存储在实现所有这些的函数上,基于每个变量名称。path1

有人可能会质疑这是否足够简洁和可读,值得费心。对我来说,判决还没有出来。如果不是因为需要第二次调用该函数,我想我在结构上会很好。v()

我看到的唯一功能问题是它不是线程安全的。代码的两个副本可以同时运行,并在两次调用 之间遇到争用条件。如果每次使用时都未能选择唯一的变量名称,那么同样的问题就会大大放大。这可能是这里的交易杀手。v()

谁能看到如何使用它来获得类似的解决方案而没有缺点?

评论

0赞 Miguel Guthridge 3/1/2022
海象操作员 () 是一个更好的解决方案 imo:=
0赞 BrokenBenchmark 3/1/2022
OP 表示他们有一个早于 3.8 的 Python 版本,所以不幸的是,海象运算符不在桌面上。
1赞 BrokenBenchmark 3/1/2022
条件之外的赋值最多添加一行代码,因此在清洁度方面,门槛相当高。
0赞 CryptoFool 3/2/2022
@BrokenBenchmark - 同意。这不是我要用的东西。它需要比这更好一点。希望比我聪明的人能想到最后的调整,使它有用。
0赞 CryptoFool 3/7/2022
(请注意,我还没有接受这个作为正确答案:o)