【问题标题】:I just don’t understand this wrapper parameters' workings?我只是不明白这个包装器参数的工作原理?
【发布时间】:2021-01-06 04:36:27
【问题描述】:
# This version only accepts one argument
# def shout(fn):
#     def wrapper(name):
#         return fn(name).upper()
#     return wrapper

# This version works with any number of args
def shout(fn):
    def wrapper(*args, **kwargs):
        return fn(*args, **kwargs).upper()
    return wrapper

@shout
def greet(name):
    return f"Hi, I'm {name}."

@shout
def order(main, side):
    return f"Hi, I'd like the {main}, with a side of {side}, please."

@shout
def lol():
    return "lol"

print(greet("todd"))
print(order(side="burger", main="fries"))
print(lol())

在上面的代码中,

def wrapper(*args, **kwargs):

print(f"abc is {fn.__name__}")

    return fn(*args, **kwargs).upper()

    return wrapper

当包装函数执行时,它如何知道要分配给 * args 和 **kwargs 的参数的值。我们这里没有定义参数的值,而是给了 func 参数。

side="burger", main="fries".

**kwargs open up the dictionary but when did we defined such dictionary?

side="burger", main="fries" 如何设置为包装函数的参数,为什么将它们分配给 args 和 kwargs ? 为什么给 fync 的参数分配给包装函数的参数?

【问题讨论】:

标签: python wrapper


【解决方案1】:

它们是在您调用函数时设置的。当您调用包装器时,所有位置参数都打包到args 中,所有关键字参数都放入kwargs,然后将其解包并传递给包装函数。

【讨论】:

    【解决方案2】:

    当你打电话时:

    order(side="burger", main="fries")
    

    您实际上是使用这些参数调用wrapper()

    这是分配**kwargs 的时间。

    wrapper() 然后用*args**kwargs 调用你的实际函数order()

    【讨论】:

    • 为什么使用这些参数调用包装函数?
    • 因为@shout; def order(...)表示:order = shout(order)表示现在order指的是wrapper,它是从shout()返回的。
    • 我的意思是为什么 order(side="burger", main="fries") 这些被分配给 kwargs?我的意思是我们没有写 wrapper(side="burger", main="fries" ") ??
    • 是的,你写了wrapper(side="burger", main="fries"),因为你有@shout; def order(...),正如我在之前的评论中所说的那样。
    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 2013-07-24
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    相关资源
    最近更新 更多