Я хотел бы распечатать имя переменной, которая предоставляется при использовании функции в Python.
Цель состоит в том, чтобы использовать предоставленное имя в печатном тексте.
Есть несколько вопросов по схожим темам, но я не могу найти точное решение или подход.
Я использую Python 3 в Windows.
(Python version: 3.12.3 (tags/v3.12.3:f6650f9, Apr 9 2024, 14:05:25) [MSC v.1938 64 bit (AMD64)]
Предыдущие вопросы и ответы:
Как получить буквальное значение
Как напечатать исходное имя переменной
Пример:
import pandas as pd
data_ok = {'col_a':[1,1,1,1],\
'col_b':[2,2,2,2],\
'col_c':[3,3,3,3]}
data_no = {'col_a':[1,1,1,1],\
'col_b':[2,2,2,2],\
'col_d':[4,4,4,4]}
df_ok = pd.DataFrame(data_ok)
df_no = pd.DataFrame(data_no)
print(df_ok)
print(df_no)
def df_check(df_in):
need_cols = ['col_a', 'col_b', 'col_c']
have_cols = df_in.columns.tolist()
check_cols = all(e in have_cols for e in need_cols)
assert check_cols == True, f"---------- Import Error - Check dataframe {df_in} columns in file. The columns must include : {need_cols} ----------"
if check_cols == True:
print("\n\n", "-"*80, '(required columns found!' , need_cols)
print("\n\n", "-" * 80, '(continuing with analysis)' )
df_check(df_ok)
df_check(df_no)
-------------------------------------------------------------------------------- (required columns found! ['col_a', 'col_b', 'col_c'] )
-------------------------------------------------------------------------------- (continuing with analysis)
#...
assert check_cols == True, f"---------- Import Error - Check dataframe {df_in} columns in file. The columns must include : {need_cols} ----------"
^^^^^^^^^^^^^^^^^^
AssertionError: ---------- Import Error - Check dataframe col_a col_b col_d
0 1 2 4
1 1 2 4
2 1 2 4
3 1 2 4 columns in file. The columns must include : ['col_a', 'col_b', 'col_c'] ----------
Цель:
Есть ли способ заставить напечатанное сообщение сообщать имя предоставленного фрейма данных, а не печатать сам фрейм данных?
AssertionError: ---------- Import Error - Check dataframe "df_no" columns in file. The columns must include : ['col_a', 'col_b', 'col_c'] ----------
Возможный ответ здесь: stackoverflow.com/questions/2749796/…
Да. Передайте его как аргумент функции.
Судя по вашему профилю, вы много работаете с R, у которого есть... интересные... правила пространства имен. С Python это просто не сработает. Если вы обнаружите, что используете хаки, подобные тому, на который ссылается Райан, вы почти наверняка делаете это неправильно.
@roganjosh согласился! Я считаю, что нашел ответ, который делает то, что нужно ОП, но, как всегда: то, что вы можете, не обязательно означает, что вы должны...
Обратите внимание, что у параметра может даже не быть имени. Например. df_list = [pd.DataFrame(data_ok), pd.DataFrame(data_no)] тогда df_check(df_list[0])






Вы можете проверить встроенную функцию globals(), чтобы увидеть, имеет ли объект, переданный в df_check, то же самое id.
import pandas as pd
... # code omitted for brevity
df_ok = pd.DataFrame()
df_no = pd.DataFrame()
def df_check(df_in) -> None:
... # insert other code here
df_name = (
[k for k, v in globals().items() if # get all names defined in the global scope
isinstance(v, pd.DataFrame) and # check if the object is a DataFrame
id(v) == id(df_in)] # check if that object matches the one passed to df_in
)[0] # get the 0th (and only) element from this list
print(df_name) # just an example so we can see the result
df_check(df_no)
# >>> df_no
df_check(df_ok)
# >>> df_ok
Примечание: вы можете якобы пропустить проверку того, является ли объект DataFrame (закомментируйте вторую строку в этом списке), поскольку только переданный объект будет соответствовать df_in, независимо от того, что это такое, но никогда не помешает быть более явным.
В общем, это работает, но я бы не советовал этого делать. Вероятно, это больше проблем, чем необходимо, если все, что вам нужно, — это сообщение об ошибке, которое равнозначно «Этот DataFrame не имеет требуемого формата столбца».
Короче говоря, это можно сделать, но я согласен с вашим мнением. В этом случае сок выжимать не стоит.
@blueandgrey Да, в этом вся суть
Что делать, если у него несколько имен?