2015-03-10 4 views
-1

Я программист, новый для python, пытающийся написать простую функцию test1(), которая использует arg (или * arg), чтобы распечатать, как она была вызвана с использованием «имени» аргумента, переданного это, а не содержимое списка или любая другая переменная, которую я передаю.Печать имени переменной

Следующий пример:

def test1(arg): 

    print "name of arg is %r" % arg 


alphabet = ['a', 'b', 'c'] 

test1(alphabet) # prints name of arg is ['a', 'b', 'c'] 

Я хочу, чтобы напечатать: название арг является алфавит я исследовал и пытался несколько вещей, связанных с использованием * ARGV, но не удалось. Может кто-то пролить свет на это? Я чувствую, что мне не хватает чего-то очевидного. Спасибо!

+4

объекты Python являются [как бродячих кошек] (https://docs.python.org/3/faq/programming.html#how-can-my-code-discover-the-name-of-an-object): они не знают или не заботятся об их именах , и может иметь несколько имен или быть безымянными. – Kevin

+0

Это нигде рядом с дубликатом. На самом деле это не имеет никакого отношения к * argv *, поскольку это известно в мире программирования. –

+0

@TimCastelijns. К сожалению, вы правы. Я должен был внимательно прочитать вопрос. Я удалил свой дубликат комментария. К сожалению, я не могу удалить свой флаг, но я думаю, что взыскательный модератор отклонит мой флаг. Прошу прощения, Том Д. – dbank

ответ

0

Я не совсем уверен, почему вы хотите это, во всяком случае ...

Если вы хотите, имя аргумента, доступных в функции, вы должны передать имя аргумента функции. Python - вызов по ссылке во всех случаях.

В вашей функции arg всегда будет называться arg внутри функции. Его внешнее имя переменной недоступно внутри функции.

def test1(arg): 
    print "name of arg is %r" % arg 

Однако python имеет переменные аргументы ключевого слова и существует возможное решение вашей проблемы. Позвольте мне переопределить test1():

def test1(**kwargs): 
    param_name = iter(kwargs).next() 
    print "name of parameter is %s" % param_name 

Вы можете вызвать эту функцию с помощью ключевого слова аргумент:

alphabet = ['a', 'b', 'c'] 
test1(alphabet=alphabet) 

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

+0

dhke, Спасибо за быструю помощь! Причина, по которой я хотел, чтобы функция test1() могла называть ее из разных мест в большой программе. Знание имени или имени переданного аргумента помогло бы определить, откуда оно было вызвано. Это будет полезный журнал или инструмент обучения. Я понимаю, что есть другие способы достижения тех же результатов. Ваше решение ** kwargs будет работать, а также передать второй аргумент со строкой, которая сообщает имя передаваемого аргумента. Будучи новичком в Python, я просто подумал, что может быть что-то еще более эффективное, чего я не видел. Еще раз спасибо! –

+0

python фактически передает ссылки на объекты по значению. если бы он действительно проходил по ссылке, это сработало бы: 'j = 61; def f (i): i = 7; е (к); assert (j == 7) ' – acushner

+0

@acushner Если вы хотите, чтобы это было правильно, вы получаете пропуск по ссылке, но вы получаете * копию ссылки *, такую ​​же, как, например, Java это делает. C++, конечно, немного отличается. – dhke

1

Это больше, чем немного некрасиво, но это один из способов добиться того, что вы после:

import traceback 
import re 

alphabet = ['a', 'b', 'c'] 

def test(arg): 
    stack = traceback.extract_stack() 
    arg_name = re.sub('test\((.*)\)', '\g<1>', stack[-2][-1]) 
    print arg_name 

test(alphabet) 
test('foo') 

В результате которого

alphabet 
'foo' 
+2

Если бы я когда-либо видел это в производственном коде, я бы тихо плакал. +1 –

+1

@AdamSmith: я бы плакал, но это определенно было бы * не * быть тихо;) –

+0

@Demian - Это красиво для меня, регулярные выражения и все! У меня есть чему поучиться. Ура! –

Смежные вопросы