2009-11-02 10 views
38

मैं एक PHP पृष्ठभूमि से आया हूं और यह जानना चाहता हूं कि पाइथन में ऐसा करने का कोई तरीका है या नहीं।इसे लिखने के लिए अनुरोध लिखने से कैसे बचें। GET.get() दो बार?

बजाय::

if(getData()){ 
    $data = getData(); 
    echo $data; 
} 

मैं यह कर सकता:

if($data = getData()){ 
    echo $data; 
} 

आप अगर getData() मौजूद है देखने के लिए जाँच

PHP में आप इस तरह एक तीर से 2 पक्षियों को मार सकता है और यदि ऐसा होता है, तो आप इसे एक कथन में एक चर के लिए असाइन करते हैं।

मैं जानना चाहता था कि पाइथन में ऐसा करने का कोई तरीका है या नहीं? तो बजाय ऐसा करने का:

if request.GET.get('q'): 
    q = request.GET.get('q') 
    print q 

बचने request.GET.get('q') दो बार लेखन।

+0

क्या आपके पास पाइथन ट्यूटोरियल बुकमार्क किया गया है? कौनसा? –

+1

बस आधिकारिक एक: http://docs.python.org/tutorial/ – givp

+2

शुक्र है, पाइथन में यह सी गलत नहीं है, और सामान्यतः, अधिकांश भाषाओं में जो इसे सी/सी ++ से विरासत में मिला है, इसका उपयोग फहरा हुआ है पठनीयता और स्पष्टता कारणों के लिए। –

उत्तर

25
शायद

आप वास्तव में क्या नहीं सोच रहे थे, लेकिन ...

q = request.GET.get('q') 
if q: 
    print q 

है?

+0

हाँ, यह सही है। पैटर्न एक चर का उपयोग करना है यदि केवल और यदि यह अस्तित्व में है (जिसका अर्थ है कि यह वैध मान देता है, यानी * कुछ भी * झूठा *)। –

+0

धन्यवाद, ऐसा लगता है कि ऐसा करने का सबसे अच्छा तरीका है। जैसा कि @ एडम कहते हैं, पाइथन में ऐसा करना संभव नहीं है। धन्यवाद। – givp

+7

इस समाधान की सीमा यह है कि यदि आप इसे if-elif-elif-elif इत्यादि की श्रृंखला में उपयोग करना चाहते हैं। उदाहरण के लिए, यह अन्य SO प्रश्न देखें: http://stackoverflow.com/questions/122277/how-do -या-अनुवाद-यह-नियमित-अभिव्यक्ति-idiom-from-perl-in-python –

24

इस कार्य के लिए मेरे 8 वर्षीय नुस्खा here देखें।

# In Python, you can't code "if x=foo():" -- assignment is a statement, thus 
# you can't fit it into an expression, as needed for conditions of if and 
# while statements, &c. No problem, if you just structure your code around 
# this. But sometimes you're transliterating C, or Perl, or ..., and you'd 
# like your transliteration to be structurally close to the original. 
# 
# No problem, again! One tiny, simple utility class makes it easy...: 

class DataHolder: 
    def __init__(self, value=None): self.value = value 
    def set(self, value): self.value = value; return value 
    def get(self): return self.value 
# optional but handy, if you use this a lot, either or both of: 
setattr(__builtins__,'DataHolder',DataHolder) 
setattr(__builtins__,'data',DataHolder()) 

# and now, assign-and-set to your heart's content: rather than Pythonic 
while 1: 
    line = file.readline() 
    if not line: break 
    process(line) 
# or better in modern Python, but quite far from C-like idioms: 
for line in file.xreadlines(): 
    process(line) 
# you CAN have your C-like code-structure intact in transliteration: 
while data.set(file.readline()): 
    process(data.get()) 
+29

आपके पास 8 साल का एक स्मार्ट स्मार्ट है! ;) – unutbu

+2

@unutbu, हे - यह मेरी (पुरानी) बिल्ली होगी क्योंकि मेरे बच्चे थोड़ा पुराने हैं ... मेरी छोटी बेटी ने अभी टेलीकॉम इंजीनियरिंग (उन्नत रेडियो सिस्टम, ज्यादातर) में पीएचडी शुरू की है ... ;-) –

0

खैर, यह एक तरह से

q = request.GET.get('q') 
if q: 
    print q 

एक खनन (लेकिन बेहतर नहीं, कॉल कुछ भी नहीं की मुद्रित करने के लिए की वजह से) होगा तरीका होगा

print request.GET.get('q') or '', 
2
q = request.GET.get('q') 
if q: 
    print q 
else: 
    # q is None 
    ... 

एक बार में असाइनमेंट और सशर्त करने का कोई तरीका नहीं है ...

+0

स्पष्ट से स्पष्ट स्पष्ट है। पठनीयता की गणना करता है। नियमों को तोड़ने के लिए विशेष मामले पर्याप्त नहीं हैं। आप अपने कोड में इतनी ऊर्ध्वाधर जगह को सहेज रहे हैं कि उन सभी लाइनों को कुछ भी नहीं बल्कि सही ब्रेस के साथ लिखकर, तो पाइथन में स्पष्टता के लिए क्यों न जाएं? व्यक्तिगत रूप से, मैंने सी पर अपने दांत काट दिया और अब 12 साल के लिए पाइथन कोड लिख रहे हैं, और मुझे कभी नहीं पता था कि यह सुविधा गायब थी। आपको बस ऐसा करने की ज़रूरत नहीं है। –

+0

@ माइकल: मैं लगभग सभी मामलों में सहमत हूं। मैं इसे अन्य नियमित अभिव्यक्तियों का परीक्षण करने के विशिष्ट उपयोग मामले में बस याद कर रहा हूं, जैसा कि इस अन्य SO प्रश्न में वर्णित है: http://stackoverflow.com/questions/122277/how-do-you-translate- यह-regular-expression- idiom-from-perl-in-python –

2

प्राप्त() एक अपवाद है जब वह वहां नहीं है फेंकता है, तो आप

try: 
    q = request.GET.get('q') 
    print q 
except : 
    pass 
9

एक बदलाव कर सकता है Alex's answer पर:

class DataHolder: 
    def __init__(self, value=None, attr_name='value'): 
     self._attr_name = attr_name 
     self.set(value) 
    def __call__(self, value): 
     return self.set(value) 
    def set(self, value): 
     setattr(self, self._attr_name, value) 
     return value 
    def get(self): 
     return getattr(self, self._attr_name) 
save_data = DataHolder() 

उपयोग:

if save_data(get_input()): 
    print save_data.value 

या यदि आप एक पसंद करते हैं वैकल्पिक इंटरफ़ेस:

if save_data.set(get_input()): 
    print save_data.get() 

मैं यह सहायक में नियमित अभिव्यक्ति की एक श्रृंखला का परीक्षण करने मिलेगा एक अगर-elif-elif-elif आदि का निर्माण, this SO question में के रूप में:

import re 

input = u'test bar 123' 
save_match = DataHolder(attr_name='match') 
if save_match(re.search('foo (\d+)', input)): 
    print "Foo" 
    print save_match.match.group(1) 
elif save_match(re.search('bar (\d+)', input)): 
    print "Bar" 
    print save_match.match.group(1) 
elif save_match(re.search('baz (\d+)', input)): 
    print "Baz" 
    print save_match.match.group(1) 
+0

मुझे डेटाहोल्डर को '__call __() 'के अतिरिक्त जोड़ना पसंद है, लेकिन मुझे समझ में नहीं आता कि यह' attr_name' निर्दिष्ट करना क्यों उपयोगी है। यदि डेटाहोल्डर एक सिंगलटन था या यदि इसका एक उदाहरण कई मान रख सकता है, प्रत्येक अलग-अलग विशेषताओं में, मैं समझता हूं, लेकिन ऐसा लगता है कि यहां एक मजबूत उद्देश्य नहीं है। –

+1

@ एलएस: हाँ, मैं इसे 'मान' या 'x' के रूप में ठीक कर सकता था।लेकिन [अच्छे परिवर्तनीय नाम] (http://c2.com/cgi/wiki?GoodVariableNames) पठनीयता में सुधार करते हैं। यह इसका सार है। –

0
config_hash = {} 
tmp_dir = ([config_hash[x] for x in ["tmp_dir"] if config_hash.has_key(x)] or ["tmp"])[0] 
print tmp_dir 
config_hash["tmp_dir"] = "cat" 
tmp_dir = ([config_hash[x] for x in ["tmp_dir"] if config_hash.has_key(x)] or ["tmp"])[0] 
print tmp_dir 
0

एक संभव तरीका यह करने के लिए, करने के लिए आवश्यकता के बिना पहले वैरिएबल सेट करें, जैसे:

if (lambda x: globals().update({'q':x}) or True if x else False)(request.GET.get('q')): 
    print q 

..यह सिर्फ मज़ेदार है - इस विधि का उपयोग नहीं किया जाना चाहिए, क्योंकि यह बदसूरत हैक है, पहली नजर में समझना मुश्किल है, और यह एक वैश्विक चर (केवल अगर स्थिति पूरी हो जाती है) बनाता है/ओवरराइट करता है)

0

बस कोशिश करें:

print(request.GET.get('q', '')) 

जो मूल रूप से कुछ भी नहीं प्रिंट यदि पहला तर्क (dict.get देखें) मौजूद नहीं है।


वैकल्पिक समाधान पायथन में एक सशर्त अभिव्यक्ति का उपयोग करने के लिए होगा:

<expression1> if <condition> else <expression2> 

लेकिन आप उदाहरण के लिए चर दो बार दोहरा पहुंच जाएंगे,:

print(request.GET.get('q') if request.GET.get('q') else '') 

के लिए लूप में परिवर्तनीय असाइनमेंट, here में चेक करें।

संबंधित मुद्दे