Dzisiaj natknąłem się na artykuł o nowościach w PHP 5.3. Dobrze, że udało im się przepchnąć dwa istotne elementy (przestrzenie nazw i funkcje lambda/domknięcia). Postęp znaczący! Problem jednak w tym, że te slogany ładnie wyglądają na papierze, ale niestety czasem sprawią problemy, bo diabeł tkwi w szczegółach. Dwa przykłady:
- importowanie przestrzeni nazw bez przedrostków działa dla klas, ale nie dla funkcji i stałych :(
- funkcje lambda są zmiennymi (
$na początku), ale standardowe funkcje tak nie mają, więc jest ewidentne rozdwojenie wymuszające pisanie$test()zamiasttest():(
Może wyglądam na czepialskiego, ale to elementy mocno przeszkadzające, jeśli chce się na przykład utworzyć spójną bibliotekę o czystym API.
Funkcje lambda i domknięcia w Pythonie 2.x (na pocieszenie coś, czego w PHP jeszcze nie ma):
# Obiekty mogą zachowywać się jak funkcje...
# Pojawi się w PHP 5.3 (metoda __invoke)
class FunClass(object):
def __init__(self):
self._times_called = 0
def __call__(self, test1, test2):
self._times_called += 1
return test1 + test2
fun2 = FunClass()
print fun2._times_called
print fun2(1, 1)
print fun2._times_called
# Funkcje obsługują domknięcia...
# Pojawi się w PHP 5.3, jako dodatek do funkcji lambda.
def fun3(test1):
def fun3a(test2):
return test1 + test2
return fun3a
real_fun3 = fun3(3)
print real_fun3(5)
# Funkcje mogą mieć właściwości...
#
def fun1(test1, test2):
return test1 + test2
fun1.safe = False
if getattr(fun1, 'safe', False):
print fun1(1, 1)
else:
print "%s is not safe" % fun1.__name__
PS. Znających Pythona proszę o pominięcie ciszą stwierdzenia z artykułu, że "The biggest benefit namespaces will provide is shortening of long classnames.".
0 komentarze:
Post a Comment