gpt4 book ai didi

Python 装饰器 staticmethod 对象不可调用

转载 作者:行者123 更新时间:2023-12-01 02:25:29 27 4
gpt4 key购买 nike

您好,我正在尝试创建一个装饰器,但收到staticmethod object not callable错误,下面是我的代码

from db.persistence import S3Mediator
from sqlalchemy.ext.declarative import declarative_base
import logging
from functools import wraps

Base = declarative_base()

def s3(func):
@wraps(func)
def wrapper(*args, **kwargs):
try:
s3client = S3Mediator.get_s3_connection()
kwargs["s3client"] = s3client
retval = func(*args, **kwargs) #### an error is raised here
except Exception as e:
raise e
return retval
return wrapper

这是实例化 s3 对象的中介

import boto3
import logging

class S3Mediator(object):
s3_client = None

def __init__(self, host, access_key, secret):
self.client = boto3.client(
's3',
aws_access_key_id= access_key,
aws_secret_access_key= secret
)

S3Mediator.s3_client = self.client

@staticmethod
def get_s3_connection():
return S3Mediator.s3_client

现在S3Mediator 已经在 app.py 中实例化现在我尝试使用这个装饰器作为

@s3
@staticmethod
def s3_connect(s3client):
# code don't reach here. An error is thrown
# do something here

enter image description here

知道为什么它返回一个静态方法对象不可调用以及如何解决这个问题

最佳答案

好的,找到问题的原因了。我将 @staticmethod 放在我的装饰器下面,这就是为什么我的装饰器认为装饰器的所有方法都是静态的。我只是改变了

@s3
@staticmethod
def s3_connect(s3client):
# code don't reach here. An error is thrown
# do something here

到此

@staticmethod
@s3
def s3_connect(s3client):
# code don't reach here. An error is thrown
# do something here

关于Python 装饰器 staticmethod 对象不可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47454113/

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