2015-09-15 13 views
7

İleti ile çağrılan bir günlük işlevini ve ardından yazdırılacak bir veya daha fazla değişkeni tanımlamak istiyorum. Yani, böyle bir şey şu:Değişken argümanlarını önceki yığından gelen adlarla nasıl yazdırırım?

log("Oh no, error.", x, d) 

günlük sorta tanımlanmış olacaktır istiyorum:

Oh no, error. 
    x = 5 
    d = { foo: "Foo", goo: "Goo" } 

bu hiç yapılabilir:

def log(msg, *arg): 
    # Loop through arg, printing caller's variable's name and value. 

Bu aşağıdaki dosyaya giriş yapacaktır ? İncelemeyi kullanarak yerlileri ve argümanları yazdırabilirim, ancak önceki karenin değişken adlarını kullanarak mevcut karedeki değerler arasında yineleyip yineleyemediğimi bilmiyorum. (inspect.getargvalues(previousFrame) yılında locals çok isim, ancak diğer isimlerin çok vardır.)

+1

Değişken adlarını benzersiz olarak nasıl belirlersiniz? Arayan isim alanında 'y' olsaydı ve değeri de '5' olsaydı ne olurdu? Eğer arayan kişi 'd ['foo']' gibi bir şey geçerse? Arayanın ad alanındaki nesnelere rasgele tekrarlamanız gerekiyor mu? Bir işlev çağrısının sonucunu geçerse ne olur? log ('mesaj', x.bar()) '? Burada çözmek oldukça zor olan bir sürü durum var ... ama muhtemelen kümeyi inceleyebilir ve arayanın yerel değişkenlerinin _all_'ini yazdırabilirsiniz. – mgilson

+0

* iç çek * Evet, sanırım doğru mgilson. Peki ne yapmalıyım? Bu yazıyı silmeli miyim? Ya da belki de benim arzulu düşüncem, sadece verdiğim değişkenleri kaydeden bir günlük fonksiyonu istiyorum. Bu hiç bitmeyecek mi? Yani, eğer 5'i geçirirse, 5 = 5 basar, eğer y geçirirse, y = 5'i basar. Eğer bir nesneyi geçirirse, object = str (object) basar. – Bitdiot

+0

@Bitdiot, neden? Kötü yazılmadı ya da kötü organize edilmedi. Ve şahsen benim için soru ilginç – ForceBru

cevap

4

Ben böyle bir şey kullanabilirsiniz düşünüyorum:

tanım

def log(msg, **kwargs): 
    print(msg) 
    for key, value in kwargs.items(): 
     print('{0} = {1}'.format(key,value)) 

tanımı (sipariş mutlaka ise)

def log(msg, **kwargs): 
    print(msg) 
    for key, value in sorted(kwargs.items()): 
     print('{0} = {1}'.format(key,value)) 

kullanım

msg='Oh no, error' 
log(msg, x=5, y=6) 

çıkış

Oh no, error 
y = 6 
x = 5 
çok kirli olabilir ve (benim makinede yapar) zaman zaman çalışmayabilir, ama hile gibi görünüyor
+2

Bu iyi, çünkü herhangi bir kara büyü kullanmıyor. Ayrıca [açık, örtük olmaktan iyidir] (https://www.python.org/dev/peps/pep-0020/). –

+2

Argümanların sırasının mutlaka beklentileriniz olmadığını unutmayın. Http://stackoverflow.com/questions/8977594/in-python-what-determines-the-order-while-iterating-through-kwargs –

+0

Haklısın, burada hesaba katılmadım, sözlüklerin sıralanmadığını belirtmeliydim. Cevabı ben düzenledim. – jlnabais

1

.

Ayrıca, tüm bu **keargs hile gerekmez. Sadece log('Message',as,many,args,as,you,want)'u ara ve hepsi bu. log başka fonksiyonu çalıştırmak bile

import inspect, gc 

def log(msg,*args): 
    #This gets the source code line that has to do with args 
    #I mean, that calls log 
    code=''.join(inspect.getframeinfo(gc.get_referrers(args)[0].f_back).code_context).strip() 
    #get the arguments (except msg) 
    c=code.split('log')[1].strip() 
    c=c.replace('(','').replace(')','') 
    c=c.split(',')[1:] 
    if c[-1].endswith(';'): 
     c[-1]=c[-1].replace(';','') 

    for x in xrange(0,len(c)): 
     print c[x],'=',args[x] 


a=5; b='hello' 

print 'test' 

log('hello',a,b); 

print 'hello' 

, sorun yok.

+0

Bunu denedim. Gerçekten şık görünümlü kod, ancak günlük birden fazla satırdan geçerse, yukarı çıkacak gibi görünüyor.Yine de hoşuma gidiyor, ama sanırım anahtar = val çözümüne doğru eğiyorum. – Bitdiot

İlgili konular