我会与许多我没有编写的深度嵌套的 json 交互,并且想让我的 python 脚本对无效输入更加“宽容”。我发现自己编写涉及 try-except 块,而宁愿只是将可疑函数包装起来。

我知道吞下异常是一个糟糕的策略,但我宁愿稍后打印和分析它们,而不是实际停止执行。在我的用例中,继续在循环中执行比获取所有键更有值(value)。

这是我现在正在做的事情:

try:
    item['a'] = myobject.get('key').METHOD_THAT_DOESNT_EXIST()
except:
    item['a'] = ''
try:
    item['b'] = OBJECT_THAT_DOESNT_EXIST.get('key2')
except:
    item['b'] = ''
try:
    item['c'] = func1(ARGUMENT_THAT_DOESNT_EXIST)
except:
    item['c'] = ''
...
try:
    item['z'] = FUNCTION_THAT_DOESNT_EXIST(myobject.method())
except:
    item['z'] = ''

这是我想要的,(1):
item['a'] = f(myobject.get('key').get('subkey'))
item['b'] = f(myobject.get('key2'))
item['c'] = f(func1(myobject)
...

或(2):
@f
def get_stuff():
   item={}
   item['a'] = myobject.get('key').get('subkey')
   item['b'] = myobject.get('key2')
   item['c'] = func1(myobject)
   ...
   return(item)

...我可以将单个数据项 (1) 或主函数 (2) 包装在某个函数中,该函数将执行暂停异常转换为空字段,打印到标准输出。前者将是一种逐项跳过 - 在该键不可用的情况下,它记录空白并继续前进 - 后者是一个行跳过,如果任何字段不起作用,则整个记录是跳过。

我的理解是某种包装器应该能够解决这个问题。这是我尝试过的,带有包装器:
def f(func):
   def silenceit():
      try:
         func(*args,**kwargs)
      except:
         print('Error')
      return(silenceit)

这就是它不起作用的原因。调用一个不存在的函数,它不会尝试捕获它:
>>> f(meow())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'meow' is not defined

在我什至添加一个空白的返回值之前,我想让它正确地 try catch 。如果该功能有效,这将打印“错误”,对吗?

包装函数在这里是正确的方法吗?

更新

我在下面有很多非常有用、有用的答案,感谢您提供的答案——但我已经编辑了上面使用的示例以说明我试图捕获的不仅仅是嵌套的关键错误,我我专门寻找一个函数来包装一个 try-catch ......
  • 当方法不存在时。
  • 当对象不存在,并且正在获取对其调用的方法时。
  • 当不存在的对象作为函数的参数被调用时。
  • 这些东西的任意组合。
  • 奖励,当函数不存在时。
  • 最佳答案

    您可以使用 defaultdict 和 the context manager approach as outlined in Raymond Hettinger's PyCon 2013 presentation

    from collections import defaultdict
    from contextlib import contextmanager
    
    @contextmanager
    def ignored(*exceptions):
      try:
        yield
      except exceptions:
        pass
    
    item = defaultdict(str)
    
    obj = dict()
    with ignored(Exception):
      item['a'] = obj.get(2).get(3)
    
    print item['a']
    
    obj[2] = dict()
    obj[2][3] = 4
    
    with ignored(Exception):
      item['a'] = obj.get(2).get(3)
    
    print item['a']
    

    关于python - 通用装饰器来包装尝试,除了在 python 中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15572288/

    10-15 12:52