Одним из способов было бы написать простую функцию для этого, например ::
def fin(obj): return "null" if obj is None else format(obj, '.1f')
logging.info("temp1 = %s, temp2 = %s, position = %s", fin(t1), fin(t2), fin(pos))
# INFO:root:temp1 = null, temp2 = 0.2, position = 6.8
Или вы можете написать функцию, которая будет принимать и форматировать несколько аргументов:
def fins(*objs):
return ("null" if obj is None else format(obj, '.1f') for obj in objs)
logging.info("temp1 = %s, temp2 = %s, position = %s", *fins(t1, t2, pos))
# INFO:root:temp1 = null, temp2 = 0.2, position = 6.8
РЕДАКТИРОВАТЬ: Или, с Python 3.6+ f-строк:
def ff(obj, fmt):
return "null" if obj is None else format(obj, fmt)
logger.info(f"temp1 = {ff(t1, '.1f')}, temp2 = {ff(t2, '.1f')}, position = {ff(pos, '.2f')}")
# temp1 = None, temp2 = 0.2, position = 6.79
или, используя точность, когда obj является float, и str (obj) в противном случае:
def ff(obj, p):
return format(obj, '.%df' % p) if isinstance(obj, float) else str(obj)
logger.info(f"temp1 = {ff(t1, 1)}, temp2 = {ff(t2, 1)}, position = {ff(pos, 2)}")
# temp1 = None, temp2 = 0.2, position = 6.79
где во всех случаях:
t1, t2, pos = None, 0.234, 6.789
Если вы хотите преобразовать все числа с плавающей точкой, переданные в качестве logging
аргументов, таким образом, вы можете создать пользовательский обработчик , но это кажется излишним и склонным к конвертации вещей, которые вы можете не хочу.