0
def check(ok, msg): 
    if not ok: 
    print msg 

check(a = 1, "a=1 expected") 
check(bugFile == None, "We still have a bugfile = " + bugFile) 

Я хочу, чтобы последняя строка была оценена только тогда, когда bugFile != None. Это разумно?Lazy python format

+0

Вы знаете, что вы печатаете строку только тогда, когда 'bugFile' принимает значение ложь? – aIKid

+1

Mate, это только ухудшило ситуацию. :/ – wdh

+1

Путаница в том, что вы сказали, что хотите проверить, является ли 'bugFile' _defined_. Правда, вы хотите узнать, является ли это «Нет». Есть разница. – iCodez

ответ

2

Для этого конкретного случая, достаточно легко решить:

def check(ok, msg, msg_args=()): 
    if not ok: 
    print msg % msg_args 

check(a == 1, "a=1 expected") 
check(bugFile == None, "We still have a bugfile = %s", bugFile) 

В целом, однако, это может не так легко отложить вычисление. В худшем случае, вы можете использовать анонимные функции (лямбды):

def check(ok, msg_f): 
    if not ok: 
    print msg_f() 

check(a == 1, lambda: "a=1 expected") 
check(bugFile == None, lambda : "We still have a bugfile = %s" % bugFile) 

Вы также можете проверить lazypy, если вы заинтересованы в ленивой оценке.

Наконец, оператор % является deprecated, так что вы можете использовать str.format вместо

+0

Я пробовал запятую и получил 'heck() принимает ровно 2 аргумента (3 заданных)'. Я не люблю определять лямбду каждый раз. – Val

+0

@Val вам нужно обновить функцию 'check'. Заметьте, я добавил к нему аргумент – goncalopp

+0

@Val [Лучше использовать 'functools.partial'] (http://stackoverflow.com/questions/3252228/python-why-is-functools-partial-necessary), проверьте мое решение. –

3

Может быть, вы ищете что-то вроде этого, используя str.format:

def check(ok, msg, val): 
    if not ok: 
    print msg(val) 

check(bugFile is None, "We still have a bugfile = {}".format, bugFile) 

Демо:

>>> bugFile = None 
>>> check(bugFile is None, "We still have a bugfile = {}".format, bugFile) 
>>> bugFile = 100 
>>> check(bugFile is None, "We still have a bugfile = {}".format, bugFile) 
We still have a bugfile = 100 

Другим вариантом может быть functools.partial, здесь нет необходимости передавать дополнительный параметр val:

from functools import partial 
def check(ok, msg): 
    if not ok: 
    print msg() 

bugFile = None 
check(bugFile is None, partial("We still have a bugfile = {}".format, bugFile)) 
bugFile = 100 
check(bugFile is None, partial("We still have a bugfile = {}".format, bugFile)) 
1

Похоже, вы пытаетесь использовать assert:

>>> a = 2 
>>> assert a == 1, "a == 1 expected" 

Traceback (most recent call last): 
    File "<pyshell#30>", line 1, in <module> 
    assert a == 1, "a == 1 expected" 
AssertionError: a == 1 expected 

Как вы можете видеть, когда a не 1 он бросает исключение.

>>> bugfile = None 
>>> assert bugfile == None, "We still have a bugfile = " + bugfile 

Как вы можете видеть, когда bugfile является None он ничего не делает.

>>> bugfile = 'omg! a bug' 
>>> assert bugfile == None, "We still have a bugfile = " + bugfile 

Traceback (most recent call last): 
    File "<pyshell#34>", line 1, in <module> 
    assert bugfile == None, "We still have a bugfile = " + bugfile 
AssertionError: We still have a bugfile = omg! a bug 

И когда это что-то, он бросает исключение!


Если вы беспокоитесь об исключениях, попробуйте следующее:

>>> bugfile = 'omg! a bug' 
>>> if not bugfile == None: print "We still have a bugfile = " + bugfile 

We still have a bugfile = omg! a bug # as you can see, it printed. 

>>> bugfile = None 
>>> if not bugfile == None: print "We still have a bugfile = " + bugfile 

>>> # everything okay 
+0

Да, утверждаю. Я создал свою собственную для большей гибкости. Но, вы правы, я могу захватить его в обработчике исключений. – Val

0

Если bugFile всегда будет определен, то ниже должно быть все, что вам нужно.

if bugFile != None: 
    print "We still have a bugfile = " + bugFile 

Если вы не знаете, если переменная bugFile определена, то вы можете попытаться вызвать NameError, что питон бросает, когда он пытается прочитать переменную, которая не определена, а затем поймать его с исключением.

try: 
    if bugFile != None: 
     print "We still have a bugfile = " + bugFile 
    else: 
     print "bugFile is None" 
except NameError: 
    print "bugFile is not defined at all" 

Пожалуйста, не делайте второго, если вы можете его избежать. Вы пожалеете об этом в будущем.

+0

Я определил функцию проверки, потому что мне не нравится копировать-вставлять 'if-error_report' каждый раз. – Val

0

Если вы хотите, чтобы начать использовать лямбда-функции, вы можете распечатать в Python3 это также будет работать:

bugfile = "something" 
output = lambda x: print("We still have a bugfile {0}".format(x)) if x else print("Bug is gone") 

>>>output(bugfile) 
>>>"We still have a bugfile something" 
>>>bugfile = "" 
>>>output(bugfile) 
>>>"Bug is gone"