LINUX.ORG.RU

Python: передать в функцию имя и значение переменной


0

1

Возможно ли как-то передать в функцию переменную так, чтобы передать не только значение, но и имя передаваемой переменной? Например:

var1 = 17

showNameAndMeaning(var1)

var1 = 17


Долго копался со всякими %s и %d, но здравый выход так и не пришел в голову.



Последнее исправление: ghostmansd (всего исправлений: 1)

Use **kwargs, Luke!

def f(**kwargs):
  print kwargs


>>> f(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3}
Sosiska
()
In [1]: def foo(**kwargs):
   ...:     for i,j in kwargs.items():
   ...:         print i,j
   ...:         

In [2]: foo(var=1, second_var=2)
var 1
second_var 
provaton ★★★★★
()

Если юзать kwargs как тут писали выше, то придется писать так

var1=17
func(var1=var1)

альтернатива - передавать имя переменной отдельно в виде строки. Еще один вариант передавать только имя переменной в виде строки, а дальше вычислять ее значение в вышележащем кадре стека при помощи eval - будет чуть лаконичней в использовании, но это уже некое читерство;-)

AIv ★★★★★
()
>>> bar = 17
>>> def foo(var): print globals()[var]
... 
>>> foo('bar')
17
anonymous
()

> Возможно ли как-то передать в функцию переменную так, чтобы передать не только значение, но и имя передаваемой переменной?

Ты хочешь очень странного, скажи лучше зачем тебе такое понадобилось.

anonymous
()
Ответ на: комментарий от mmarkk

Почему странная-то? :-) Всего-навсего хочу записывать в файл переменные в виде «VarName=VarMeaning», каждое с новой строки, а потом при необходимости их оттуда считывать. Увидев строку вида «makarena=137», Питон должен будет на основании сей находки создать переменную makarena и присвоить ей значение 137. Можно было бы просто построчно записать переменные и не париться с именами, но переменные будут очень похожи, и запоминать, на какой строке что находится, нет никакого желания. :-( Может, есть способ поэлегантнее? Например, кинуть в таблицу? Но ведь оттуда хочется так же считывать. Беда, в общем.

ghostmansd
() автор топика

Как один из вариантов:

import inspect

def foo(a, b = 30):
  ### NOTE: CPython implementation detail: This function relies on Python stack frame support in the interpreter, which isn’t guaranteed to exist in all implementations of Python. If running in an implementation without Python stack frame support this function returns None.
  currentFrame = inspect.currentframe()

  print currentFrame.f_code.co_varnames

:)

kondor ★★★
()
Ответ на: комментарий от ghostmansd

а так, вообще, да, ConfigParser или ручной парсинг с занесением в дикт и потом его возвратом (что явно, лютый велосипедизм).

mmarkk
()
Ответ на: комментарий от ghostmansd

>Увидев строку вида «makarena=137», Питон должен будет на основании сей находки создать переменную makarena и присвоить ей значение 137.

И как потом работать с этой переменной?:D

Nirdosh
()
Ответ на: комментарий от Sosiska

да, особенно учитывая как она кросс-питоно-версионна и удобна для чтения глазами, то, конечно, для конфигфайлов это лучший выбор.

mmarkk
()
Ответ на: комментарий от Sosiska

Там вообще вроде бинарник генерируется, насколько я понял. Такое и ручками-то не поправишь. Ладно, можно ведь передавать в функцию два аргумента (точнее, дважды повторенный один, второй раз - в кавычках). На данный момент хватит. А так, буду копать в сторону словарей. Большое всем спасибо за подсказки и советы!

ghostmansd
() автор топика
Ответ на: комментарий от mmarkk

Из описания задачи топикстартером, мне показалось, что он говорит про сериализацию, сам этого не понимая. Если это так - то надо юзать pickle(что я регулярно делаю со структурами в сотни мегабайт и проблем не возникает).

Если же задача вынести конфиг в отдельный файл - то да, ConfigParser доступен из-коробки и также удобен.

В любом случае, ТС хочет сделаеть велосипед.

Sosiska
()
Ответ на: комментарий от ghostmansd

если надо руками править, то тогда ConfigParser, как и говорит коллега mmarkk

Sosiska
()
Ответ на: комментарий от ghostmansd

> Может, есть способ поэлегантнее?

Есть: pickle, marshall, simplejson. Способов сериализации в питоне дохрена!

provaton ★★★★★
()
(defmacro test (var)
  `(format t "~A = ~A" ',var ,var))

CL-USER> (defvar foo 42)
FOO

CL-USER> (test foo)
FOO = 42

Enjoy your python.

anonymous
()
Ответ на: комментарий от anonymous
>>> class Hero:
...     def __init__(self, substance, action):
...         self.name = name
...         self.substance = substance
...         self.action = action
...     def __repr__(self):
...         return "%s(name=%r, substance=%r, action=%r)" % (
...             self.__class__.__name__, self.name, self.substance, self.action)

>>> yaml.load("""
... !!python/object:__main__.Hero
... name: Lvsn
... substance: shit
... action: eat
... """)

Hero(name='Lvsn', substance=shit, action=eat)

njoy yer shit

shty ★★★★★
()
Ответ на: комментарий от anonymous

We enjoy our python with a great pleasure.

import sys
import dis
import StringIO

def get_arg_name(arg):
    oldstdout = sys.stdout
    sys.stdout = StringIO.StringIO()

    frame = sys._getframe(1)
    dis.dis(frame.f_code)
    listing = sys.stdout.getvalue()

    sys.stdout = oldstdout

    founded = False
    for l in listing.splitlines():
        if founded:
            return l.split()[3].strip('()')

        try:
            ln, _, _, _, _ = l.split()
        except ValueError:
            continue

        if int(ln) == frame.f_lineno:
            founded = True

    return None

var1 = 5
var2 = 10

print get_arg_name(var1)
print get_arg_name(var2)


def func(param):
    print get_arg_name(param)

    local_var = 'test'
    print get_arg_name(local_var)

func(9000)
var1
var2
param
local_var
baverman ★★★
()
Ответ на: комментарий от baverman

> We enjoy our python with a great pleasure.

Вытаскивая-то имя переменной в рантайме через страшную жопу? Ну да, питонщики такое любят.

anonymous
()
Ответ на: комментарий от shty

Штя, твой тупой мозг настолько съеден пистоном, что ты даже лавсана от нелавсана не отличаешь.

anonymous
()
Ответ на: комментарий от anonymous

Вытаскивая-то имя переменной в рантайме через страшную жопу?

Не смотри на детали реализации, дольше проживешь. Ох, прости, ты же CLщик, у вас без этого никак, протекающие абстракции тупо не работают.

baverman ★★★
()

А потом у них питон тормозит…

Deleted
()
Ответ на: комментарий от anonymous

ты даже лавсана от нелавсана не отличаешь

во-первых я в сортах лавсана не разбираюсь, а во-вторых лавсанчик - это собирательный образ

shty ★★★★★
()
Ответ на: комментарий от vasily_pupkin

> Он в функцию просил ;)

Это он от незнания.

// razinie $tudy

anonymous
()
Ответ на: комментарий от baverman

> Не смотри на детали реализации

Быдлокодер такое быдло.

anonymous
()
Ответ на: комментарий от shty

> лавсанчик - это собирательный образ

Собирательный образ человека, превосходящего тебя в умственном развитии, судя по всему. Реднеки таких не любят.

anonymous
()
>>> def namestr(**kwargs):
...     for k,v in kwargs.items():
...       print "%s = %s" % (k, repr(v))
...
>>> namestr(a=1, b=2)
a = 1
b = 2
chinarulezzz ★★
()
Ответ на: комментарий от tailgunner

> Но лиспер ее не решил.

Нет, решил, и гораздо более общим способом, чем все двадцатистрочные питоновые излияния.

anonymous
()
Ответ на: комментарий от anonymous

Опять лиспер гордится решением никому не нужной задачки. Ну что поделать? Родовая травма что ли такая? Лучше иди привязки строчи к сишным либам.

baverman ★★★
()
Ответ на: комментарий от baverman

> никому не нужной задачки

Где-то я уже такое слышал: «раз не умею, значит, не нужно».

А советовать будешь своему отцу.

anonymous
()
Ответ на: комментарий от baverman

> завязанное на детали реализации

Так раз язык убогий, то ничего сделать и нельзя, не завязываясь на реализацию. Так что в этом отношении совсем не лиспоподобное.

anonymous
()
Ответ на: комментарий от anonymous

Где-то я уже такое слышал: «раз не умею, значит, не нужно».

Это же священная мантра всех маргиналов, только немножко перефразированная. Нехорошо передергивать, дружок.

baverman ★★★
()
Ответ на: комментарий от baverman

> завязанное на детали реализации

Так раз язык убогий, то ничего сделать и нельзя, не завязываясь на реализацию. Так что в этом отношении совсем не лиспоподобное.

anonymous
()
Ответ на: комментарий от baverman

> Это же священная мантра всех маргиналов, только немножко перефразированная. Нехорошо передергивать, дружок.

Так получается, что маргинал ты, а не я.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.