Только для горизонтального, вы можете обмануть тень с помощью overflow в своем родительском div:
<div class="parent">
<div class="box-shadow">content</div>
</div>
.parent{
overflow:hidden;
}
.box-shadow{
box-shadow: box-shadow: 0 5px 5px 0 #000;
}
Вы действительно не создали декоратора. Декоратор должен вернуть оригинальную функцию или подходящую замену .
Ваш декоратор ничего не возвращает:
def calcul_time(fonction):
avant = time.time()
fonction()
apres = time.time()
print(apres - avant)
Декоратор обычно возвращает ] оберточная функция . Вы создали функцию обертки, но не декоратор, который ее возвращает.
Это был бы правильный декоратор:
def calcul_time(fonction):
def wrapper():
avant = time.time()
fonction()
apres = time.time()
print(apres - avant)
return wrapper
Я переименовал вашу обертку calcul_time
в wrapper
, удалил аргумент fonction
(который будет передан декоратору, вы можете положиться на него как на закрытие) и вернул wrapper
. Теперь декоратор возвращает замену.
Вероятно, вы хотите сделать его более родовым и пройти через произвольные аргументы с помощью *args
и **kwargs
и обработать как возвращаемое значение (передать его до вызывающего абонента wrapper()
) и исключений.
Вы также хотите использовать декоратор @functools.wraps()
для копирования таких вещей, как имя и атрибуты из обернутой функции в оболочку :
from functools import wraps
def calcul_time(fonction):
@wraps(fonction)
def wrapper(*args, **kwargs):
avant = time.time()
try:
return fonction(*args, **kwargs)
finally:
apres = time.time()
print(apres - avant)
return wrapper
try..finally
гарантирует, что print()
выполняется независимо от того, что происходит в fonction
.