RE Python tidak mengikuti prinsip ini. Secara umum, itu mengikuti prinsip. Contoh dasar:
>>> x = ['foo']
>>> x
['foo']
>>> x = (lambda: ['foo'])()
>>> x
['foo']
Namun, Python mendefinisikan ekspresi dan pernyataan secara terpisah. Karena if
cabang, while
loop, penugasan destruktif dan pernyataan lainnya tidak dapat digunakan dalam lambda
ekspresi sama sekali, surat prinsip Tennent tidak berlaku untuk mereka. Meski begitu, membatasi diri untuk hanya menggunakan ekspresi Python masih menghasilkan sistem lengkap Turing. Jadi saya tidak melihat ini sebagai pelanggaran terhadap prinsip; atau lebih tepatnya, jika itu melanggar prinsip, maka tidak ada bahasa yang mendefinisikan pernyataan dan ungkapan secara terpisah yang dapat sesuai dengan prinsip tersebut.
Juga, jika tubuh lambda
ekspresi menangkap jejak tumpukan, atau melakukan introspeksi lain dalam VM, itu bisa menyebabkan perbedaan. Tapi menurut saya ini seharusnya tidak dianggap sebagai pelanggaran. Jika expr
dan (lambda: expr)()
perlu mengkompilasi dengan bytecode yang sama, maka prinsipnya benar-benar menyangkut kompiler bukan semantik; tetapi jika mereka dapat dikompilasi ke bytecode yang berbeda, kita seharusnya tidak mengharapkan negara VM menjadi identik dalam setiap kasus.
Suatu kejutan dapat ditemui menggunakan sintaksis pemahaman, meskipun saya percaya ini bukan pelanggaran prinsip Tennent juga. Contoh:
>>> [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]
Yang mengejutkan adalah hasil dari bagaimana definisi daftar didefinisikan. Pemahaman 'kejutan' di atas setara dengan kode ini:
>>> 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]
Dilihat dengan cara ini, pemahaman 'kejutan' di atas kurang mengejutkan, dan bukan pelanggaran prinsip Tennent.