Tôi đang gặp khó khăn trong việc tìm ra cái này và tôi tiếp tục nhận được một kiểu. Tôi cần một người trang trí để áp dụng một người trang trí khác chỉ lấy các đối số nếu một điều kiện giữ. Kiểu hàng có liên quan đến các đối số được chuyển sang phương thức outer[]
.
def decorator[foo, bar]:
def wrapped[func]:
@wraps[func]
def outer[]:
...stuff with foo and bar...
return func[]
return outer
return wrapped
def conditional[func]:
@wraps[func]
def inner[]:
if some_condition:
raise Error
return decorator[1, 2][func]
return inner
@app.route['/login', methods=['POST']]
@conditional
def login[]:
...
Điều này tạo ra TypeError: outer[] takes 0 positional arguments but 2 were given
, nhưng với một số câu lệnh in cơ bản [chủ yếu là outer[*args], print[args]
] tôi thấy đó là như sau:
Vị trí đầu tiên:
{'wsgi.version': [1, 0], 'wsgi.url_scheme': 'http', 'wsgi.input': , 'wsgi.errors': , 'wsgi.multithread': True, 'wsgi.multiprocess': False, 'wsgi.run_once': False, 'werkzeug.server.shutdown': , 'SERVER_SOFTWARE': 'Werkzeug/0.14.1', 'REQUEST_METHOD': 'POST', 'SCRIPT_NAME': '', 'PATH_INFO': '/login', 'QUERY_STRING': '', 'REMOTE_ADDR': '127.0.0.1', 'REMOTE_PORT': 54900, 'SERVER_NAME': '127.0.0.1', 'SERVER_PORT': '5000', 'SERVER_PROTOCOL': 'HTTP/1.1', 'HTTP_HOST': '127.0.0.1:5000', 'HTTP_USER_AGENT': 'python-requests/2.20.1', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_ACCEPT': '*/*', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_AUTHORIZATION': 'Basic cGF1bDpmb29iYXI=', 'CONTENT_LENGTH': '0', 'werkzeug.request': }
Vị trí thứ hai:
Ở đâu đó, cú pháp đường của tôi đang đi sai, không chắc chắn ở đâu.
Bằng cách sử dụng *args
, Kiểu xơ được giải quyết, nhưng một loại mới xuất hiện:
TypeError: 'function' object is not iterable
GEEKSFORGEEKS
3 *args
8'GEEKSFORGEEKS'
1'GEEKSFORGEEKS'
1 TypeError: 'function' object is not iterable
0outer[]
1
'GEEKSFORGEEKS'
5'GEEKSFORGEEKS'
3 TypeError: outer[] takes 0 positional arguments but 2 were given
4
'GEEKSFORGEEKS'8
outer[]
7 'GEEKSFORGEEKS'04
'GEEKSFORGEEKS'05
*args
8'GEEKSFORGEEKS'1
'GEEKSFORGEEKS'1
'GEEKSFORGEEKS'09
outer[]
1GEEKSFORGEEKS
3 *args
8'GEEKSFORGEEKS'
1'GEEKSFORGEEKS'
1 TypeError: 'function' object is not iterable
0outer[]
1
'GEEKSFORGEEKS'
5'GEEKSFORGEEKS'
3 TypeError: outer[] takes 0 positional arguments but 2 were given
4
'GEEKSFORGEEKS'8
outer[]
7 'GEEKSFORGEEKS'04
'GEEKSFORGEEKS'
05 *args
8'GEEKSFORGEEKS'
1'GEEKSFORGEEKS'
1 'GEEKSFORGEEKS'
09outer[]
1
Cải thiện bài viết
Phương pháp 1: Khi người trang trí quyết định làm thế nào để bọc một chức năng
- Trong trường hợp này, chức năng được chuyển cho một người trang trí bình thường
- Sau đó dựa trên điều kiện, người trang trí quyết định phải làm gì với mã
Chương trình sau đây chuyển một hàm bình thường cho trình trang trí thì nếu điều kiện đã cho là đúng, chương trình sẽ trả về chuỗi ở chữ hoa và nếu nó sai thì nó sẽ trả lại nó ở trường hợp thường.
'GEEKSFORGEEKS'0____11
'GEEKSFORGEEKS'2
'GEEKSFORGEEKS'3
'GEEKSFORGEEKS'4
'GEEKSFORGEEKS'5
'GEEKSFORGEEKS'3
'GEEKSFORGEEKS'7
'GEEKSFORGEEKS'8
'GEEKSFORGEEKS'9
'GEEKSFORGEEKS'1
GEEKSFORGEEKS1
'GEEKSFORGEEKS'8
GEEKSFORGEEKS3
GEEKSFORGEEKS4
GEEKSFORGEEKS5
GEEKSFORGEEKS6
'GEEKSFORGEEKS'1
GEEKSFORGEEKS8
'GEEKSFORGEEKS'8
outer[]
0outer[]
1GEEKSFORGEEKS5
GEEKSFORGEEKS6
'GEEKSFORGEEKS'1
outer[]
5'GEEKSFORGEEKS'8
outer[]
7 outer[]
8'GEEKSFORGEEKS'5
outer[]
7 TypeError: outer[] takes 0 positional arguments but 2 were given
1TypeError: outer[] takes 0 positional arguments but 2 were given
2
'GEEKSFORGEEKS'3
TypeError: outer[] takes 0 positional arguments but 2 were given
4'GEEKSFORGEEKS'5
outer[]
7 TypeError: outer[] takes 0 positional arguments but 2 were given
7TypeError: outer[] takes 0 positional arguments but 2 were given
8TypeError: outer[] takes 0 positional arguments but 2 were given
9
Output:
'GEEKSFORGEEKS'
Phương pháp 2: Trong đó, các nhà trang trí chỉ được gọi nếu một điều kiện nhất định được đáp ứng.
Trong chương trình sau, chương trình đưa đầu vào của người dùng để quyết định điều kiện. Nếu người dùng nhập 1, bộ trang trí được gọi và chuỗi được trả về ở chữ hoa. Nếu người dùng vào 2, một lần nữa, một công cụ trang trí được gọi và chuỗi đã cho được trả về bằng chữ thường. Ngoài ra, nếu bất kỳ số nào khác được nhập, hàm được trả về vì nó không có bất kỳ sửa đổi nào.
'GEEKSFORGEEKS'3
outer[*args], print[args]
1'GEEKSFORGEEKS'5
'GEEKSFORGEEKS'3
'GEEKSFORGEEKS'7
'GEEKSFORGEEKS'8
'GEEKSFORGEEKS'9
'GEEKSFORGEEKS'1
GEEKSFORGEEKS1
'GEEKSFORGEEKS'8
GEEKSFORGEEKS3
GEEKSFORGEEKS4
GEEKSFORGEEKS5
GEEKSFORGEEKS6
'GEEKSFORGEEKS'1
GEEKSFORGEEKS8
'GEEKSFORGEEKS'5
outer[]
7 TypeError: outer[] takes 0 positional arguments but 2 were given
1'GEEKSFORGEEKS'3
TypeError: outer[] takes 0 positional arguments but 2 were given
4'GEEKSFORGEEKS'5
'GEEKSFORGEEKS'3
'GEEKSFORGEEKS'7
'GEEKSFORGEEKS'8
'GEEKSFORGEEKS'9
'GEEKSFORGEEKS'1
GEEKSFORGEEKS1
'GEEKSFORGEEKS'8
GEEKSFORGEEKS3
GEEKSFORGEEKS4
'GEEKSFORGEEKS'8
outer[]
7 outer[]
8'GEEKSFORGEEKS'5
outer[]
7 TypeError: outer[] takes 0 positional arguments but 2 were given
1'GEEKSFORGEEKS'3
TypeError: outer[] takes 0 positional arguments but 2 were given
4'GEEKSFORGEEKS'5
outer[]
7 TypeError: outer[] takes 0 positional arguments but 2 were given
7'GEEKSFORGEEKS'5
TypeError: 'function' object is not iterable
8Phương pháp 2: Trong đó, các nhà trang trí chỉ được gọi nếu một điều kiện nhất định được đáp ứng.
Trong chương trình sau, chương trình đưa đầu vào của người dùng để quyết định điều kiện. Nếu người dùng nhập 1, bộ trang trí được gọi và chuỗi được trả về ở chữ hoa. Nếu người dùng vào 2, một lần nữa, một công cụ trang trí được gọi và chuỗi đã cho được trả về bằng chữ thường. Ngoài ra, nếu bất kỳ số nào khác được nhập, hàm được trả về vì nó không có bất kỳ sửa đổi nào.
'GEEKSFORGEEKS'3
outer[*args], print[args]
1'GEEKSFORGEEKS'5
'GEEKSFORGEEKS'12
Phương pháp 2: Trong đó, các nhà trang trí chỉ được gọi nếu một điều kiện nhất định được đáp ứng.
Trong chương trình sau, chương trình đưa đầu vào của người dùng để quyết định điều kiện. Nếu người dùng nhập 1, bộ trang trí được gọi và chuỗi được trả về ở chữ hoa. Nếu người dùng vào 2, một lần nữa, một công cụ trang trí được gọi và chuỗi đã cho được trả về bằng chữ thường. Ngoài ra, nếu bất kỳ số nào khác được nhập, hàm được trả về vì nó không có bất kỳ sửa đổi nào.
outer[]
0outer[]
1
Phương pháp 2: Trong đó, các nhà trang trí chỉ được gọi nếu một điều kiện nhất định được đáp ứng.
Trong chương trình sau, chương trình đưa đầu vào của người dùng để quyết định điều kiện. Nếu người dùng nhập 1, bộ trang trí được gọi và chuỗi được trả về ở chữ hoa. Nếu người dùng vào 2, một lần nữa, một công cụ trang trí được gọi và chuỗi đã cho được trả về bằng chữ thường. Ngoài ra, nếu bất kỳ số nào khác được nhập, hàm được trả về vì nó không có bất kỳ sửa đổi nào.
TypeError: outer[] takes 0 positional arguments but 2 were given
8TypeError: outer[] takes 0 positional arguments but 2 were given
9
Output:
GEEKSFORGEEKS