2009-07-26 12 views
11

मुझे पूरा यकीन नहीं है कि मेरा मतलब क्या है, इसलिए कृपया मेरे साथ भालू ..पायथन में कार्यों के लिए अभिव्यक्ति पास?

वर्गक्लेमी में, ऐसा प्रतीत होता है कि मुझे अभिव्यक्ति पारित करनी है? कुछ मामलों में filter() पर।

>>> def someFunc(value): 
... print(value) 

>>> someFunc(5 == 5) 
True 

कैसे मैं समारोह अंदर से मूल्यों == को पारित कर दिया मिलता है: जब मैं अपने आप कुछ इस तरह लागू करने के लिए प्रयास करते हैं, मैं के साथ अंत?

संपादित करें: मैं इस

>>> def magic(left, op, right): 
... print(left+" "+op+" "+right) 

>>> magic(5 == 5) 
5 == 5 

संपादित की तरह कुछ प्राप्त करने के लिए कोशिश कर रहा हूँ: क्या बारे में अगर paramaters में से एक एक वस्तु थी?

+0

के लिए ORMs के बारे में सवाल को का पालन करें: http://stackoverflow.com/questions/1185537 –

उत्तर

21

आप अपने उदाहरण प्राप्त कर सकते हैं यदि आप "सेशन" एक समारोह बनाने स्ट्रिंग। यह sort() काम जैसे कार्यों का काम करता है।

फ़िल्टर() के साथ उन SQLAlchemy उदाहरण परेशान हैं। मैं SQLAlchemy के बारे में आंतरिक नहीं जानता, लेकिन मैं query.filter (User.name == 'ed') जैसे उदाहरण में अनुमान लगा रहा हूं कि क्या हो रहा है यह है कि User.name एक SQLAlchemy- विशिष्ट प्रकार है, एक विषमता के साथ __eq() फ़ंक्शन का कार्यान्वयन जो तुलना करने के बजाय फ़िल्टर() फ़ंक्शन के लिए SQL उत्पन्न करता है। Ie: उन्होंने विशेष कक्षाएं बनाई हैं जो आपको पाइथन अभिव्यक्ति टाइप करने देती हैं जो SQL कोड को उत्सर्जित करती है। यह एक असामान्य तकनीक है, जिसे मैं तब तक टालना चाहूंगा जब तक कि ओआरएम जैसी दो भाषाओं को ब्रिजिंग न करें।

+0

ध्यान दें कि लैम्ब्डा को संश्लेषित करने की कोई आवश्यकता नहीं है। –

+3

सच है, लेकिन इसे कोष्ठक में डालने से लैम्बडा के आंतरिक मानकों के कारण इस मामले में पढ़ना आसान हो जाता है। –

+0

यदि आप चाहें - यह मेरे लिए केवल अनावश्यक माता-पिता है। –

1

आप नहीं कर सकते। अभिव्यक्ति 5 == 5 का मूल्यांकन किया जाता है और केवल तभी परिणाम कुछ फनक को पास किया जाता है। फ़ंक्शन को True (True ऑब्जेक्ट सटीक होने के लिए) प्राप्त होता है, इससे कोई फर्क नहीं पड़ता कि अभिव्यक्ति क्या थी।

संपादित करें: आपके संपादन के बारे में, this question बहुत करीब है।

संपादित करें 2: आप सिर्फ इस तरह, एक स्ट्रिंग के रूप अभिव्यक्ति गुजरती हैं और eval इस्तेमाल कर सकते हैं:

>>> def someFunc(expression_string): 
... print(expression_string, "evaluates to", eval(expression_string)) 

>>> someFunc("5 == 5") 
5 == 5 evaluates to True 

पता नहीं है कि क्या है कि आप में मदद करता है। ध्यान रखें कि eval एक शक्तिशाली उपकरण है, इसलिए इसे मनमाने ढंग से (और संभवतः यहां तक ​​कि उपयोगकर्ता द्वारा जेनरेट किए गए) इनपुट को पास करना खतरनाक है।

0

आपको पूरी चीज को शाब्दिक स्ट्रिंग के रूप में लपेटने की आवश्यकता है। आप इसे एक स्ट्रिंग के रूप में प्रिंट करने की कोशिश कर रहे हैं, मुझे लगता है, सही?

0

संक्षिप्त उत्तर: आप नहीं कर सकते। अभिव्यक्ति मूल्यांकन का नतीजा अभिव्यक्ति के बजाए फ़ंक्शन को पास कर दिया जाता है।

1

ऐसा लगता है कि eq से tuples लौट सकते हैं:

 
    >>> def magic(left, op, right): 
    ...  return op(left, right) 
    ... 
    >>> magic(5, (lambda a, b: a == b), 5) 
    True 
    >>> magic(5, (lambda a, b: a == b), 4) 
    False 

यह एक गुजर की तुलना में अधिक pythonic है:

class Foo: 
    def __init__(self, value): 
      self.value = value 

    def __eq__(self, other): 
      return (self.value, other.value) 


f1 = Foo(5) 
f2 = Foo(10) 
print(f1 == f2) 
+2

आप '__eq__' से जो कुछ भी चाहते हैं उसे वापस कर सकते हैं, लेकिन समानता की तुलना करने के लिए एक बूल को मजबूर नहीं किया जा सकता है - '__eq__' का उद्देश्य - वास्तव में एक बुरा विचार है। –

+0

यह शायद खराब अभ्यास है, लेकिन यह वैसे भी एक सैद्धांतिक सवाल है। एक "यह कैसे संभव है?" चीज टाइप करें। –

+0

SQLalchemy वास्तव में ऐसा कुछ करता है? यह एक पुस्तकालय है जो मैं 20 फुट के इस्पात ध्रुव से छू नहीं पाऊंगा। यह एक सकल, घृणित हैक है। (आप पर हमला नहीं कर रहे हैं - आप बस यह समझा रहे हैं कि उन्होंने यह कैसे किया होगा।) –

5

नेल्सन के समाधान का एक और अधिक पायथनिक संस्करण मानक लाइब्रेरी में operator मॉड्यूल से ऑपरेटर फ़ंक्शंस का उपयोग करना है; अपने स्वयं के lambdas बनाने की कोई ज़रूरत नहीं है।

>>> from operator import eq 
>>> def magic(left, op, right): 
... return op(left, right) 
... 
>>> magic(5, eq, 5) 
True 
1

आपको __eq__() लागू करना होगा। उदाहरण ::

class A(object): 
    def __eq__(self, other): 
     return (self, '==', other) 

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

def my_func(expr): 
    # deal with the expression 
    print(expr) 

>>> a = A() 
>>> my_func(a == 1) 
(<__main__.A object at 0x1015eb978>, '==', 1) 
संबंधित मुद्दे