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限制为NameErrorAttributeError