RE Python bu prensibi takip etmiyor. Genellikle prensibi izler. Temel örnek:
>>> x = ['foo']
>>> x
['foo']
>>> x = (lambda: ['foo'])()
>>> x
['foo']
Ancak, Python ifadeleri ve ifadeleri ayrı ayrı tanımlar . Yana if
dallar, while
döngüler, yıkıcı atama ve diğer ifadeleri de kullanılamaz lambda
hiç ifadeler, Tennent ilkesinin mektup kendileri için geçerli değildir. Buna rağmen, kendini yalnızca Python ifadeleriyle sınırlandırmak hala bir Turing komple sistemi üretiyor. Bu yüzden bunu ilkenin ihlali olarak görmüyorum; veya daha doğrusu, prensibi ihlal ederse, ifadeleri ve ifadeleri ayrı ayrı tanımlayan hiçbir dil ilkeye uymayabilir.
Ayrıca, lambda
ifadenin gövdesi yığın izini yakalıyorsa veya VM'de başka bir gözden geçirme gerçekleştiriyorsa, bu farklılıklara neden olabilir. Ancak bence bu ihlal olarak sayılmamalıdır. Eğer expr
ve (lambda: expr)()
mutlaka aynı baytkoduna derlemek, sonra prensip gerçekten derleyiciler değil semantik ilgilidir; ancak farklı byte kodlarını derleyebiliyorlarsa, VM durumunun her durumda aynı olmasını beklememeliyiz.
Tennent ilkesinin ihlal edilmediğine inandığım halde, anlama sözdizimini kullanarak bir sürprizle karşılaşılabilir. Örnek:
>>> [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]
Sürpriz, liste kavramalarının nasıl tanımlandığının bir sonucudur. Yukarıdaki “sürpriz” anlayışı bu koda eşdeğerdir:
>>> 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]
Bu şekilde görülüyorsa, yukarıdaki “sürpriz” anlayışı daha az şaşırtıcıdır ve Tennent ilkesinin ihlali değildir.