python获取函数[重复]的默认值。

问题描述 投票:0回答:1

如果传递给python的默认值 get 函数(对于字典)是一个表达式,是不是只有在没有找到键的时候才会被评估?让我们考虑一下下面的例子。

myDiction = {"a":1,"b":2}
val = myDiction.get("c",pow(2,3)-5)

该数学表达式是否为 pow(2,3)-5 是否被评估?

python dictionary
1个回答
4
投票

通过传递自己的函数来测试并不难。

def someF():
    print("called")
    return 3

myDiction = {"a":1,"b":2}

myDiction.get("a",someF())

打印。"called". 所以是的,它被评估了,就像你期望从任何传递给函数的参数中得到的一样。


0
投票

我们为什么不知道呢?

>>> d = {1:2}
>>> d.get(1, print('default') or 3)
default
2
>>> d.get(2, print('default') or 3)
default
3

正如你所看到的,函数参数在被传递给函数之前就已经被评估了。


0
投票

反正它是会被评估的。

试试这个。

def test_func():
    print("run")
    return 3


myDiction = {"a": 1, "b": 2}
val = myDiction.get("a", test_func())
print(val)

你可以看到,即使 a 存在于 myDiction,打印出 "运行 "信息。


0
投票

我一直希望有一个 "懒惰 "版的 dict.get 这将允许传递一个只有在键丢失很长时间后才会被调用的callable。

我们现在还没有这个功能,但我们可以很容易地实现这个功能。

from collections import UserDict

def lazy_default_func():
    print('in lazy_default_func')
    return 7

def lazy_default_func_with_args(*args, **kwargs):
    print('in lazy_default_func_with_args', 'args', args, 'kwargs', kwargs)
    return 7

class MyDict(UserDict):
    def get(self, item, default=None, *args, **kwargs):
        print('in get')
        if item in self:
            return self[item]
        if not callable(default):
            return default
        return default(*args, **kwargs)


d = MyDict({'a': 1})
print(d.get('a', lazy_default_func))
print(d.get('b', lazy_default_func))
print(d.get('b', lazy_default_func_with_args, 'arg1'))

输出

in get
1
in get
in lazy_default_func
7
in get
in lazy_default_func_with_args args ('arg1',) kwargs {}
7
© www.soinside.com 2019 - 2024. All rights reserved.