आरई पायथन इस सिद्धांत का पालन नहीं कर रहा है। आम तौर पर, यह सिद्धांत का पालन करता है। मूल उदाहरण:
>>> x = ['foo']
>>> x
['foo']
>>> x = (lambda: ['foo'])()
>>> x
['foo']
हालांकि, पायथन अभिव्यक्ति और बयानों को अलग-अलग परिभाषित करता है । चूंकि if
शाखाओं, while
छोरों, विनाशकारी असाइनमेंट और अन्य बयानों को lambda
अभिव्यक्ति में बिल्कुल भी इस्तेमाल नहीं किया जा सकता है , इसलिए टेन्नेन्ट सिद्धांत का पत्र उन पर लागू नहीं होता है। फिर भी, केवल पायथन अभिव्यक्ति का उपयोग करने के लिए अपने आप को प्रतिबंधित करना अभी भी एक ट्यूरिंग पूर्ण प्रणाली का उत्पादन करता है। इसलिए मैं इसे सिद्धांत के उल्लंघन के रूप में नहीं देखता हूं; या इसके बजाय, यदि यह सिद्धांत का उल्लंघन करता है, तो कोई भी भाषा जो बयानों और अभिव्यक्तियों को अलग-अलग परिभाषित नहीं करती है, संभवतः सिद्धांत के अनुरूप हो सकती है।
इसके अलावा, अगर lambda
अभिव्यक्ति का शरीर स्टैक ट्रेस कैप्चर कर रहा था, या वीएम में अन्य आत्मनिरीक्षण कर रहा था, जिससे मतभेद हो सकता है। लेकिन मेरी राय में इसे उल्लंघन नहीं माना जाना चाहिए। यदि expr
और (lambda: expr)()
आवश्यक रूप से एक ही बायटेकोड पर संकलित किया जाता है, तो सिद्धांत वास्तव में चिंता करता है कि शब्दार्थ नहीं; लेकिन अगर वे अलग-अलग बायोटेक के लिए संकलन कर सकते हैं, तो हमें वीएम राज्य से प्रत्येक मामले में समान होने की उम्मीद नहीं करनी चाहिए।
एक समझदार वाक्य रचना का उपयोग करके एक आश्चर्य का सामना किया जा सकता है, हालांकि मेरा मानना है कि यह टेनेंट सिद्धांत का उल्लंघन नहीं है। उदाहरण:
>>> [x for x in xrange(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [f() for f in [lambda: x for x in xrange(10)]] # surprise!
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
>>> # application of Tennent principle to first expression
... [(lambda: x)() for x in xrange(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [f() for f in [(lambda x: lambda: x)(x) for x in xrange(10)]] # force-rebind x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> map(lambda f:f(), map(lambda x: lambda: x, xrange(10))) # no issue with this form
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
आश्चर्य यह है कि सूची समझ कैसे परिभाषित की जाती है। उपरोक्त 'आश्चर्य' की समझ इस कोड के बराबर है:
>>> result = []
>>> for x in xrange(10):
... # the same, mutable, variable x is used each time
... result.append(lambda: x)
...
>>> r2 = []
>>> for f in result:
... r2.append(f())
...
>>> r2
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
इस तरह से देखें, तो ऊपर दिए गए 'आश्चर्य' की आशंका कम आश्चर्यजनक है, न कि टेन्नेन्ट सिद्धांत का उल्लंघन।