这可能是有史以来最愚蠢的问题,但我想知道是否有办法在函数(最好是装饰器)周围编写一个包装器,这样你就可以在异常情况下捕获局部变量的内部状态.在这个职能中提出 它会捕获当地人创建它们,腌制它们,然后在没有引发异常的情况下处理它们,或者如果发现任何异常则将它们写入文件.
这太过于幻想了,还是有人因这样的事情而被骗了?
我有class很多方法依赖于另一个特定实例的可能但不确定的存在class.这些方法将按以下方式进行调整:if other_instance return X else return None.实际上,我写了几个相同的if语句作为每个方法的代码的一部分.(另请注意,__init__由于继承问题,我不能使用自定义.)除了None如下所示的依赖方法(在极大简化的模型上)之外,是否有一种实用或适当的方法来限制这种冗余编码?
class QuarterResult(ParentClass):
result = None
prior = None
def get_prior_quarter(self):
# code to find prior_quarter
if prior_quarter:
self.prior = prior_quarter
return prior_quarter
# commence None-ing out unusable methods
# Note: the actual model has 10+ methods which need prior
unusable_methods = ('change_in_results', 'quarterly_return')
for mthd in unusable_methods:
setattr(self, mthd, None)
# assume this method is ALWAYS run first
def calculate_result(self, *args): …Run Code Online (Sandbox Code Playgroud) functools.wraps,以便为以后进行适当的内省和组织。wrapped_self向该__call__方法传递一个参数来实现这一点。理想的情况应该是这样的:
class A():
def __init__(self):
...
@LoggerDecorator(logger_name='test.log')
def do_something(self):
...
Run Code Online (Sandbox Code Playgroud)
到目前为止,装饰器类是(基于来自David Beazley 的 Python Cookbook 的食谱的基本记录器装饰器):
class LoggerDecorator():
def __init__(self, func, logger_name):
wraps(func)(self)
self.logger_name = logger_name
def config_logger(self):
... # for example, uses `self.logger_name` to configure the decorator
def __call__(self, wrapped_self, *args, **kwargs):
self.config_logger()
wrapped_self.logger = self.logger
func_to_return = self.__wrapped__(wrapped_self, *args, **kwargs)
return func_to_return
def __get__(self, instance, cls):
if …Run Code Online (Sandbox Code Playgroud) 假设我有一个简单的装饰器、一个类方法和一个函数,我都用该装饰器装饰它们:
import functools
def decorator(func):
@functools.wraps(func)
def call(*args):
print(args)
func(*args)
return call
class cls:
@decorator
def meth(self, a):
pass
@decorator
def func(c):
pass
cls().meth("a")
func("c")
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
(<__main__.cls object at 0x7f4665c50130>, 'a')
('c',)
Run Code Online (Sandbox Code Playgroud)
但我想self在方法上使用装饰器时删除参数,以便输出变为:
('a',)
('c',)
Run Code Online (Sandbox Code Playgroud)
但是,如果我只是添加args.pop(0),我将删除第一个参数,即使它不是self。如果是的话,我怎样才能只删除第一个参数self?
注意:我阅读了一些使用长代码的解决方案inspect- 但在这种伟大且易于使用的编程语言中一定有一种更短、更简单的方法?
编辑:使用@staticmethod对我来说不是一个选择,因为我需要self方法本身的参数。我只是不想让它被打印出来。
假设我有一个二叉搜索树 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
如果我运行以下函数,我想知道递归函数执行了多少次(在以下示例中为31)
def loopBST(root):
if not root:
return
loopBST(root.left)
loopBST(root.right)
Run Code Online (Sandbox Code Playgroud)
我可以通过创建一个全局变量来获得
global ind
ind = 0
def loopBST(root):
global ind
ind += 1
if not root:
return
loopBST(root.left)
loopBST(root.right)
loopBST(bsttree)
Run Code Online (Sandbox Code Playgroud)
变量ind将为31。
问题是,如何ind在dfs函数内部创建此变量而不是创建全局变量?