2012-07-02 21 views
6

मैं निम्नलिखित करना चाहते हैं:अजगर 2.7 स्ट्रिंग के रूप में एक समारोह के लिए इनपुट और का उपयोग कर चर

print "CC =",CC 

लेकिन एक समारोह के रूप ताकि मैं केवल चर सीसी एक बार लिखने के लिए की है। मैं काम नहीं कर सकता कि इसे किसी फ़ंक्शन में कैसे किया जाए क्योंकि यह हमेशा सीसी को फ़्लोटिंग पॉइंट नंबर (जो यह है) के रूप में मूल्यांकन करता है .... क्या एक स्ट्रिंग और फ़्लोटिंग पॉइंट दोनों के रूप में फ़ंक्शन में इनपुट स्वीकार करने का कोई तरीका है नंबर?

मैंने कोशिश की यह:

def printme(a): 
    b='%s' % a 
    print b 
    return b 

लेकिन निश्चित रूप से यह केवल इसके नाम a का मूल्य, नहीं प्रिंट करता है।

+2

पायथन गतिशील रूप से टाइप किया गया है, इसलिए संक्षिप्त जवाब "हां, ज़ाहिर है!"। लंबा उत्तर आपके द्वारा किए गए प्रयासों पर निर्भर करता है, क्या आप जो कुछ भी करते हैं उसे साझा कर सकते हैं और क्या गलत हो गया और इसके बदले आपने क्या उम्मीद की? –

+0

मैंने कई चीजों की कोशिश की है, यहां एक ऐसा स्थान है जहां मैं स्ट्रिंग और फ़्लोटिंग पॉइंट नंबर प्रिंट करने की कोशिश कर रहा हूं लेकिन इसके परिणामस्वरूप फ्लोटिंग पॉइंट प्रिंटिंग और कोई स्ट्रिंग नहीं है: – malby

+0

डीफ़ प्रिंटमेम (ए): बी = '% s', ए प्रिंट बी रिटर्न बी – malby

उत्तर

0

अगर मैं आपको सही ढंग से समझता हूं तो आपको ऐसा कुछ चाहिए?

def f(a): 
    print('{0}: = {1}'.format(locals().keys()[0], a)) 

अद्यतन:

मुझे पता है कि उदाहरण भावना का एक बहुत नहीं है हूँ, यह मूल रूप से एक ही है के रूप में के रूप में:

def f(a): 
    print('a: {0}'.format(a)) 

मैं केवल बात करने के लिए करना चाहता था स्थानीय लोगों के लिए ओपी() क्योंकि मुझे समझ में नहीं आया कि वह क्या हासिल करने की कोशिश कर रहा है।

मुझे लगता है कि यह अधिक है कि वह क्या की तलाश में:

def f(**kwargs): 
    for k in kwargs.keys(): 
     print('{0}: {1}'.format(k, kwargs[k])) 


f(a=1, b=2) 
+1

यह काम नहीं करेगा क्योंकि वेरिएबल – l4mpi

+0

के स्थानीय दायरे में नहीं है, यह बिल्कुल 'प्रिंट' ए =% s '% a' लिखने जैसा ही है क्योंकि स्थानीय नाम हमेशा' ए 'होगा। यदि यह वास्तव में ओपी चाहता है, तो यह पाइथन काम करने के तरीके के कारण नहीं किया जा सकता है। –

+0

यह काम नहीं करेगा, स्थानीय नाम हमेशा 'ए' होगा। –

0

नहीं वास्तव में आप क्या चाहते हैं, लेकिन आसान करने के लिए:

def printme(**kwargs): 
    for key, value in kwargs.items(): 
     print '%s=%s' % (key, value) 
    return value 

In [13]: printme(CC=1.23, DD=2.22) 
CC=1.23 
DD=2.22 
Out[13]: 1.23 
1

शायद एक शब्दकोश समस्या का एक बेहतर तरीका है। मान लें कि आप कई नाम-मान युग्म है कि आप उपयोग करना चाहते हैं, तो आप उन्हें एक dict में डाल कर सकते हैं:

:

params = {"CC": 1.2345, "ID": "Yo!", "foo": "bar"} 

तो, उदाहरण के लिए, आप सभी के नाम और मान अच्छी तरह से इस प्रकार फ़ॉर्मेट प्रिंट कर सकता है

for key in params: 
    print "{0} = {1}".format(key, params[key]) 

लेकिन चूंकि यह अभी भी अस्पष्ट है क्यों आप ऐसा करने की कोशिश कर रहे हैं, यह कहना मुश्किल है कि यह सही तरीका है या नहीं।

+1

कारण यह है कि मुझे केवल एक बार सीसी लिखना है और दो बार नहीं। मैं यह बहुत कुछ करूँगा इसलिए शॉर्टंड उपयोगी है, मैं जिस अनुप्रयोग का उपयोग करता हूं वह वैज्ञानिक कंप्यूटिंग है, इसलिए गणितीय एल्गोरिदम को कोड करते समय आप इसे डीबग करने के लिए हर समय करते हैं, उदाहरण के लिए मैटलैब में यह बहुत आसान है क्योंकि आप केवल वैरिएबल नाम टाइप करते हैं और matlab इसके मूल्य देता है। – malby

+2

+1 ओपी चाहता है यह नहीं है, लेकिन ओपी क्या करना चाहिए। मैंने SO पर इस तरह के बहुत सारे प्रश्न देखे हैं और उनमें से प्रत्येक निर्णय के साथ समाप्त होता है कि एक नियम का उपयोग करना समस्या को हल करने का सबसे सुविधाजनक और सबसे महत्वपूर्ण तरीका है। – Vader

+0

@Vader, मुझे नहीं लगता कि यह प्रश्न स्ट्रिंग स्वरूपण के बारे में कैसा है। ओपी की समस्या यह है कि * दोनों * स्पष्ट रूप से प्रदान किए बिना एक चर के अंदर परिवर्तनीय नाम और मूल्य * प्राप्त करें ("क्या एक स्ट्रिंग और फ़्लोटिंग पॉइंट नंबर दोनों के रूप में फ़ंक्शन में इनपुट स्वीकार करने का कोई तरीका है" और ".. ताकि मुझे केवल एक बार वैरिएबल सीसी लिखना पड़े ")। – catchmeifyoutry

0

यदि मैं आपको सही ढंग से समझता हूं तो आप एक परिवर्तनीय नाम और उसके मूल्य को वर्तमान दायरे में प्रिंट करने के लिए एक शॉर्टेंड चाहते हैं? यह सामान्य असंभव में दुभाषिया ट्रेस फ़ंक्शन या sys._getframe का उपयोग किये बिना सामान्य रूप से सामान्य रूप से उपयोग किया जाना चाहिए, यदि आप जानते हैं कि आप क्या कर रहे हैं।

def a(): 
    x = 1 
    magic_print("x") #will not work without accessing the current frame 

क्या आप इन के बिना नहीं कर सकते हैं स्पष्ट रूप से इस तरह एक समारोह के लिए स्थानीय लोगों से पारित किया गया है::

def printNameAndValue(varname, values): 
    print("%s=%s" % (varname, values[varname])) 

def a(): 
    x = 1 
    printNameAndValue("x", locals()) #prints 'x=1' 
इस का कारण यह प्रिंट समारोह बुला दायरे से स्थानीय लोगों को प्राप्त करने की कोई दूसरा रास्ता नहीं है कि

संपादित करें:

एक समाधान मॉड्यूल का निरीक्षण किया (जो आंतरिक रूप से sys._getframe का उपयोग करता है) का उपयोग कर के लिए catchemifyoutry द्वारा उत्तर देखें।

from modulenamehere import enableTrace, printv 

@enableTrace 
def somefunction(): 
    x = 1 
    [...] 
    printv("x") 
+0

mmm, प्रयास के लिए धन्यवाद, मुझे लगता है कि आप सही हैं कि कोई समाधान नहीं है, ऐसा लगता है कि मेरा मूल समाधान सबसे अच्छा है, पाइथन डिफ़ॉल्ट रूप से सभी इनपुट को दबाने के कारण कठिनाई उत्पन्न होती है, वास्तव में यह है इसे अक्षम करने का तरीका? – malby

+0

कोई विचार नहीं कि 'सभी इनपुट दबाने' के साथ आपका क्या मतलब है, लेकिन निरीक्षण का उपयोग करके समाधान के लिए @catchmeifyoutry द्वारा उत्तर देखें (जो आंतरिक रूप से ट्रेस फ़ंक्शन का उपयोग करता है)। – l4mpi

0

: एक मॉड्यूल में)

from sys import settrace 

__v = {} #global dictionary that holds the variables 

def __trace(frame, event, arg): 
    """ a trace function saving the locals on every function call """ 
    global __v 
    if not event == "call": 
     return __trace 
    __v.update(frame.f_back.f_locals) 

def enableTrace(f): 
    """ a wrapper decorator setting and removing the trace """ 
    def _f(*a, **kwa): 
     settrace(__trace) 
     try: 
      f(*a, **kwa) 
     finally: 
      settrace(None) 
    return _f 

def printv(vname): 
    """ the function doing the printing """ 
    global __v 
    print "%s=%s" % (vname, __v[vname]) 
यह सहेजें

और इस तरह का उपयोग करें; - पूर्णता एक समाधान का पता लगाने समारोह का उपयोग कर सीधे के लिए उपयोगी आप अजगर 2.0 का उपयोग कर और निरीक्षण कर रहे हैं तो उपलब्ध नहीं है इसे प्राप्त करने के लिए वैश्विक चर का उपयोग किया गया, func.__globals__.keys() में सभी चर func पर पास किए गए हैं, इसलिए मैंने __ के साथ स्टार्टिन नाम फ़िल्टर किया और उन्हें एक सूची में संग्रहीत किया। func() पर प्रत्येक कॉल के साथ func.__globals__.keys() नए चर नाम के साथ अपडेट हो जाता है, इसलिए नए varn को नए glo परिणामों के साथ तुलना करें जो नए चर में जोड़ा गया था।

glo=[] 
def func(x): 
    global glo 
    varn=[x for x in func.__globals__.keys() if not x.startswith('__') and x!=func.__name__] 
    new=list(set(varn)^set(glo)) 
    print("{0}={1}".format(new[0],x)) 
    glo=varn[:] 

उत्पादन:

>>> a=10 
>>> func(a) 
a=10 
>>> b=20 
>>> func(20) 
b=20 
>>> foo='cat' 
>>> func(foo) 
foo=cat 
>>> bar=1000 
>>> func(bar) 
bar=1000 
3

आप inspect मॉड्यूल (यह भी देखें this SO question) इस्तेमाल कर सकते हैं:

def printme(x): 
    import inspect 
    f = inspect.currentframe() 
    val = f.f_back.f_locals[x] 
    print x, '=', val 


CC = 234.234  
printme('CC') # <- write variable name only once 
# prints: CC = 234.234 
1

मुझे लगता है कि यह आपके लिए आवश्यक उपाय है:

def printme(x): 
    keys_list = [key for key, value in globals().iteritems() if value == x] 
    print keys_list 
    for key in keys_list: 
     if id(globals()[key]) == id(x): 
      result = "%s = %s" %(key, x) 
      print result 
      break 

    return result 

उदाहरण के लिए यदि आप एक चर घोषित:

>>> c=55.6 

तो printme (ग) के परिणाम हो जाएगा

>>> 'c = 55.6' 

नोट: यह समाधान वैश्विक रूप से अद्वितीय आईडी मिलान पर आधारित है।

+0

यह केवल तभी काम करता है जब चर 'ग्लोबल्स' में है, जिसका अर्थ है कि यह फ़ंक्शन स्थानीय लोगों के लिए बेकार है ... – l4mpi

+0

@ l4mpi पूछे जाने वाले प्रश्न के अनुसार एक चर को एक फ़ंक्शन पर पास कर दिया जाएगा। इसका मतलब यह है कि, वह चर उस फ़ंक्शन के स्थानीय() में नहीं होगा लेकिन ग्लोबल्स() में होगा। तो मैंने पहले globals() की जांच की। यह सही समाधान नहीं हो सकता है लेकिन मुझे लगता है कि यह थोड़ा संशोधन द्वारा आवश्यक समाधान दे सकता है यानी, स्थानीय() पहले जांचें। –

+0

यह गलत है और परिवर्तनीय दायरे की आपकी खराब समझ को दर्शाता है। परिवर्तक केवल 'ग्लोबल्स' में होगा यदि इसे मॉड्यूल स्तर पर घोषित किया गया है (या स्पष्ट रूप से वैश्विक रूप में घोषित किया गया है)। यदि चर किसी अन्य फ़ंक्शन के अंदर घोषित किया गया है, तो यह न तो 'ग्लोबल्स' में होगा और न ही आपके प्रिंट फ़ंक्शन के 'स्थानीय' के अंदर - 'def f (x): printme (x)' आज़माएं और फिर 'f (1)' को कॉल करें। कॉलिंग स्कोप के स्थानीय लोगों का उपयोग करके वास्तविक समाधान के लिए catchmeifyoutry जवाब देखें। – l4mpi