मैं एक पुनर्प्रयास डेकोरेटर का उपयोग करके अपनी स्क्रिप्ट में प्रश्न पूछने की कोशिश कर रहा हूं (मुझे पता है कि एक पुनः प्रयास पुस्तकालय है, लेकिन मुझे पता है कि इस त्रुटि के साथ क्यों), लेकिन मुझे एक त्रुटि मिलती है .. मैंने परिणाम बदलने की कोशिश की = func() परिणाम के लिए = func, लेकिन फिर भी त्रुटि के साथ। क्या कोई मदद कर सकता है?

import sys
import logging
from pymongo import MongoClient
import time


def retry(**kwargs):
    def wrapper(func):
        number_of_retries = 1
        while True:
            try:
                result = func()
                return result
            except Exception as e:
                logging.warning("Error {}. Attempt {}, error: {}".format(kwargs['error'], number_of_retries, e))
                number_of_retries += 1
                time.sleep(1)
                if number_of_retries > 5:
                    print("More than 5 attempts, closing the program")
                    sys.exit(1)
    return wrapper


@retry(error="connection with mongodb")
def mongo_connect():
    """" Function to connect with mongodb """
    client = MongoClient()
    client.server_info()
    db = client.test
    print(type(db))
    return db
db = mongo_connect()

त्रुटि:

raise TypeError("'Database' object is not callable. If you meant to "
TypeError: 'Database' object is not callable. If you meant to call the 'test' method on a 'MongoClient' object it is failing because no such method exists.
0
Fabio Nogueira 6 जिंदा 2021, 05:55

1 उत्तर

सबसे बढ़िया उत्तर

अगर आप डेकोरेटर्स को kwargs पास करना चाहते हैं तो आपको कुछ ऐसा करना होगा जैसे यह (पैरामीटर वाले डेकोरेटर्स) ए>। उत्तर में से एक को उद्धृत करने के लिए:

@decorator_with_args(arg)
def foo(*args, **kwargs):
    pass

में अनुवाद करता है:

foo = decorator_with_args(arg)(foo)

साधारण सज्जाकार आमतौर पर इस तरह दिखते हैं:

def decorator(func): 
    def wrapper(*args, **kwargs):
        returned_value = func(*args, **kwargs) 
        return returned_value 
    return wrapper 

यहां आपके इच्छित व्यवहार के लिए एक कार्यशील डेमो है:

import time
import logging
from functools import wraps

def retry(**fkwargs):
    def _decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for attempt in range(1, 6):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    logging.warning("Error: {}, Attempt: {}, "
                                    "Python Error: {}".format(fkwargs['error'], attempt, e))
                    time.sleep(1)
            print("More than 5 attempts, closing the program")
            # sys.exit(1)
        return wrapper
    return _decorator

@retry(error="My custom error")
def mock():
    raise ValueError("Connection Error")

>>> mock()
WARNING:root:Error: My custom error, Attempt: 1, Python Error: Connection Error
WARNING:root:Error: My custom error, Attempt: 2, Python Error: Connection Error
WARNING:root:Error: My custom error, Attempt: 3, Python Error: Connection Error
WARNING:root:Error: My custom error, Attempt: 4, Python Error: Connection Error
WARNING:root:Error: My custom error, Attempt: 5, Python Error: Connection Error
More than 5 attempts, closing the program
0
cosmic_inquiry 6 जिंदा 2021, 10:46