提问人:CryptoFool 提问时间:3/1/2022 最后编辑:BrokenBenchmarkCryptoFool 更新时间:3/1/2022 访问量:488
在调用函数时将变量内联设置为参数值
Setting a variable to a parameter value inline when calling a function
问:
在其他语言中,比如 Java,你可以做这样的事情:
String path;
if (exists(path = "/some/path"))
my_path = path;
关键是作为指定方法调用参数的一部分进行设置。我知道这在 Python 中不起作用。这是我一直希望 Python 拥有的东西。path
有什么方法可以在 Python 中实现这一点吗?我在这里所说的“完成”是指能够将调用和赋值都写成一个语句,而不需要事先支持代码。exists
path
如果一种方法需要使用对函数或方法的额外调用,包括我自己编写的任何内容,我都可以接受。我花了一点时间试图想出这样一个模块,但没能想出任何比在调用函数之前做赋值更丑陋的东西。
更新:如果可以假设 Python 3.8 或更高版本,@BrokenBenchmark的答案是完美的。不幸的是,我还不能这样做,所以我仍在寻找适用于 Python 3.7 及更早版本的这个问题的解决方案。
答:
是的,如果您使用的是 Python 3.8 或更高版本,则可以使用 walrus 运算符:
import os
if os.path.isdir((path := "/some/path")):
my_path = path
评论
我想出了一些问题,但从技术上讲确实让我到达了我想要的地方。也许其他人会有一些想法来改进它,让它变得非常酷。这是我所拥有的:
# 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()
谁能看到如何使用它来获得类似的解决方案而没有缺点?
评论
:=
评论