имя и значение переменной журнала - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу создать функцию, которая регистрирует список переменных и их значений.

У меня есть следующий код (включая ожидаемые результаты), который вылетает с сообщением об ошибке:

в logInputs var_val в callers_local_vars, если var_val - это var] + ':' + str (var)) TypeError: можно только объединить список (не "str") в список

Может кто-нибудь помочь разобраться в чем дело? Спасибо!

import logging
import inspect


logging.basicConfig(filename=r'E:\_.log', level=logging.INFO, format='%(message)s', filemode='w')

var1 = ['a', 'b']
var2 = 2

def logInputs(vars):
    logging.info(f"Expected:\nvar1: ['a', 'b']\nvar2: 2")
    for var in vars:
        callers_local_vars = inspect.currentframe().f_back.f_locals.items()
        logging.info([var_name for var_name,
                      var_val in callers_local_vars if var_val is var] + ': ' + str(var))

logInputs([var1, var2])

1 Ответ

0 голосов
/ 22 апреля 2020

Вы можете l oop на пары k / v dict callers_local_vars и проверить, что значение и значение dict указывают на один и тот же объект:

def logInputs(vars):
    logging.info("\n\n========= Inputs =========\n")
    for var in vars:
        callers_local_vars = inspect.currentframe().f_back.f_locals
        for var_name, var_val in callers_local_vars.items():
            if var_val is var:
                logging.info(var_name + ': ' + str(var))
                break

Вывод:

========= Inputs =========

var1: ['a', 'b']
var2: 2

Предупреждение : сравнение is, которое вы используете в данный момент, может ввести в заблуждение. Рассмотрим этот случай:

var0 = 2
var1 = ['a', 'b']
var2 = 2
var3 = 2

def logInputs(vars):
    logging.info("\n\n========= Inputs =========\n")
    for var in vars:
        callers_local_vars = inspect.currentframe().f_back.f_locals
        for var_name, var_val in callers_local_vars.items():
            if var_val is var:
                logging.info(var_name + ': ' + str(var))
                break

logInputs([var1, var2])

, который выдаст var0: 2 вместо var1: 2.

...