Python:单行testing语句
有没有办法在python中尝试/除了成一条线?
就像是…
b = 'some variable' a = c | b #try statement goes here
其中b
是一个声明的variables, c
不是…所以c
会抛出一个错误, a
会变成b
…
在Python中,没有办法将try
/ except
块压缩到单行上。
另外,不知道variables是否存在于Python中,就像在其他一些dynamic语言中一样。 更安全的方式(和stream行的风格)是将所有variables设置为某种东西。 如果他们可能没有设置,先设置它们为None
(或者0
或者''
或者更适用的东西)。
如果您确实先分配了您感兴趣的所有名称,则确实有选项。
-
最好的select是if语句。
c = None b = [1, 2] if c is None: a = b else: a = c
-
单行选项是一个条件expression式。
c = None b = [1, 2] a = c if c is not None else b
-
有些人滥用短路行为
or
做到这一点。 这是容易出错的,所以我从不使用它。c = None b = [1, 2] a = c or b
考虑以下情况:
c = [] b = [1, 2] a = c or b
在这种情况下,可能应该是
[]
,但它是[1, 2]
因为[]
在布尔上下文中是错误的。 因为有很多值可能是错误的,所以我不使用这个技巧。 (if foo:
if foo is not None:
人们就会遇到同样的问题)
这很糟糕,但是当我想要编写一系列debugging操作时,我在提示符处使用了它:
exec "try: some_problematic_thing()\nexcept: problem=sys.exc_info()" print "The problem is %s" % problem[1]
在大多数情况下,我一点都不为非单行尝试除外的限制所困扰,但是当我只是在试验时,我希望readline能够在交互式解释器中立刻回忆一大段代码。我可以调整它,这个小技巧派上用场。
为了实现你想要实现的目的,你可以尝试locals().get('c', b)
; 理想情况下,使用真正的字典而不是本地上下文会更好,或者在运行任何可能或不可能设置它之前将c赋给None。
你可以通过使用vars()
, locals()
或者globals()
这两个最适合你的情况的命名空间字典来实现。
>>> b = 'some variable' >>> a = vars().get('c', b)
你提到你使用的是Django。 如果你在做什么是有意义的,你可能想要使用:
my_instance, created = MyModel.objects.get_or_create()
created
将是真或假。 也许这会帮助你。
另一种方法是定义一个上下文pipe理器:
class trialContextManager: def __enter__(self): pass def __exit__(self, *args): return True trial = trialContextManager()
然后使用with
语句忽略单行中的错误:
>>> with trial: a = 5 # will be executed normally >>> with trial: a = 1 / 0 # will be not executed and no exception is raised >>> print a 5
运行时错误将不会引发exception。 这就像一个try:
except:
。
问题是,它实际上是一个django model.objects.get查询我试图testing。 如果没有find数据,则.get返回一个错误…它不会返回None(这会让我很烦恼)
使用这样的东西:
print("result:", try_or(lambda: model.objects.get(), '<n/a>'))
try_or是你定义的一个实用函数:
def try_or(fn, default): try: return fn() except: return default
您也可以将接受的exceptiontypes限制为NameError
, AttributeError
等
- 如何使用RSpec的should_raise与任何exception?
- 为什么在将客户端JBoss连接回收到远程队列之后仍然抛出SpyJMSExceptionexception?
- Java中printStackTrace()方法的用法是什么?
- locking的对象是否locking,如果内部发生exception?
- 在C中有效使用goto进行错误pipe理?
- 是否有从Python的OSError获取信息的跨平台方式?
- 在64位版本的Windows上的WinForms应用程序中,VS2010不显示未处理的exception消息
- 捕获asynchronous方法引发的exception
- 如何在Java中使用reflection来实例化内部类?