Я пытаюсь объединить все методы существующего класса (а не моего создания) в набор try/except. Это может быть любой класс, но я буду использовать класс pandas.DataFrame здесь как практический пример.Обертывание всех возможных вызовов метода класса в блоке try/except
Таким образом, если метод invoked успешно завершен, мы просто переходим. Но если он должен генерировать исключение, он добавляется к списку для последующей проверки/обнаружения (хотя приведенный ниже пример просто упрощает печать заявления печати).
(Обратите внимание, что виды исключений, связанных с данными, которые могут возникать при вызове метода в экземпляре, пока не известны, и это причина этого упражнения: обнаружение).
Этот post был весьма полезен (в частности, ответ @martineau Python-3), но у меня проблемы с его адаптацией. Ниже я ожидал второй вызов метода (завернутый) info() для выдачи вывода на печать, но, к сожалению, это не так.
#!/usr/bin/env python3
import functools, types, pandas
def method_wrapper(method):
@functools.wraps(method)
def wrapper(*args, **kwargs): #Note: args[0] points to 'self'.
try:
print('Calling: {}.{}()... '.format(args[0].__class__.__name__,
method.__name__))
return method(*args, **kwargs)
except Exception:
print('Exception: %r' % sys.exc_info()) # Something trivial.
#<Actual code would append that exception info to a list>.
return wrapper
class MetaClass(type):
def __new__(mcs, class_name, base_classes, classDict):
newClassDict = {}
for attributeName, attribute in classDict.items():
if type(attribute) == types.FunctionType: # Replace it with a
attribute = method_wrapper(attribute) # decorated version.
newClassDict[attributeName] = attribute
return type.__new__(mcs, class_name, base_classes, newClassDict)
class WrappedDataFrame2(MetaClass('WrappedDataFrame',
(pandas.DataFrame, object,), {}),
metaclass=type):
pass
print('Unwrapped pandas.DataFrame().info():')
pandas.DataFrame().info()
print('\n\nWrapped pandas.DataFrame().info():')
WrappedDataFrame2().info()
print()
Это выходы:
Unwrapped pandas.DataFrame().info():
<class 'pandas.core.frame.DataFrame'>
Index: 0 entries
Empty DataFrame
Wrapped pandas.DataFrame().info(): <-- Missing print statement after this line.
<class '__main__.WrappedDataFrame2'>
Index: 0 entries
Empty WrappedDataFrame2
В общем, ...
>>> unwrapped_object.someMethod(...)
# Should be mirrored by ...
>>> wrapping_object.someMethod(...)
# Including signature, docstring, etc. (i.e. all attributes); except that it
# executes inside a try/except suite (so I can catch exceptions generically).
P.S. Если я задержу свой ответ на комментарии или ответ, возможно, это потому, что я сначала попытаюсь сделать это или попытаюсь понять это. = :) –