Rumah > Soal Jawab > teks badan
Semasa membaca, saya mendapati bahawa kod ini agak mengelirukan, dan penghiasnya agak tidak jelas. Saya harap anda boleh membantu saya menganalisis kod ini! !
from functools import wraps
from flask import abort
from flask_login import current_user
from .models import Permission
def permission_required(permission):
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not current_user.can(permission):
abort(403)
return f(*args, **kwargs)
return decorated_function
return decorator
def admin_required(f):
return permission_required(Permission.ADMINISTER)(f)
迷茫2017-05-18 10:52:23
Mula-mula anda perlu faham prinsip penghias:
@abcd
def f():
pass
sebenarnya bersamaan dengan pernyataan berikut:
def f():
pass
f=abcd(f)
Kami kini mempunyai fungsi abcd Intipati fungsi ini ialah: ia menerima fungsi lain sebagai parameter dan mengembalikan fungsi. (Mengenai fungsi yang dikembalikan digunakan, itu terpulang kepada anda). Pada masa ini, abcd hanyalah fungsi, bukan pengubah suai.
Dan kerana permintaan berikut adalah sangat biasa: terdapat fungsi lama, dan kami ingin mentakrifkan fungsi baharu ini secara amnya mempunyai fungsi yang serupa dengan fungsi lama, tetapi mempunyai lebih sedikit fungsi baharu, seperti mencetak a tarikh dan menilai seseorang atau sesuatu. Kemudian fungsi lama pasti akan dipanggil semasa proses mentakrifkan fungsi baru Namun, fungsi baru sebenarnya tidak banyak berubah, dan fungsi lama selalunya tidak berguna (kerana kita biasanya menggunakan fungsi baru kemudian), jadi untuk itu. menghalang ruang nama daripada berubah Untuk mengelakkan kekeliruan dan memudahkan pembangunan, kita hanya boleh menggunakan nama fungsi lama untuk mewakili fungsi baharu iaitu, selepas mentakrifkan fungsi baharu, kita menukar namanya semula kepada f sebelumnya, dan sebelumnya f tiada lagi. Jadi kita boleh melakukan ini: Tentukan fungsi abcd, yang menerima fungsi f dan mengembalikan fungsi baharu, dan kemudian memberikan nilai pulangannya (fungsi baharu) kepada f (nama fungsi dalam python juga boleh diberikan nilai, menjadi satu lagi fungsi). Inilah sebenarnya yang dilakukan oleh sekeping kod kedua saya di atas. Oleh kerana keperluan ini sangat biasa, Python mentakrifkan sintaks khusus untuknya. Tidakkah anda mahu f=abcd(f) setiap kali? . Pada masa ini, abcd menjadi penghias. Memahami hubungan kesetaraan ini, fungsi anda akan lebih mudah difahami: apabila anda menggunakannya di suatu tempat, ia akan kelihatan seperti ini
@permission_required(permission)
def old():
pass
def old():
pass
old = permission_required(permission)(old)
Keutamaan adalah sama, operasi adalah dari kiri ke kanan, dan fungsi yang ditakrifkan di sini dikira terlebih dahulu.
Prosesnya ialah:
old = permission_required(permission)(old)
-> old = decorator(old)
-> old = decorated_function
给我你的怀抱2017-05-18 10:52:23
Semoga kod berikut akan membantu anda
from functools import wraps
def permission_required(permission):
"""返回装饰器,装饰器中使用入参 permission
"""
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not permission:
print '403'
return
return f(*args, **kwargs)
return decorated_function
return decorator
def admin_required_true(f):
"""装饰器函数,返回装饰器
"""
return permission_required(True)(f)
def admin_required_false(f):
"""装饰器函数,返回装饰器
"""
return permission_required(False)(f)
@admin_required_true
def foo():
"""使用装饰器
"""
print 'foo'
@admin_required_false
def bar():
"""使用装饰器
"""
print 'bar'
foo()
bar()
Hasil lari:
foo
403