Hướng dẫn python conditional decorator with arguments - trang trí có điều kiện python với các đối số

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 *args8
'GEEKSFORGEEKS'
1
'GEEKSFORGEEKS'
1 TypeError: 'function' object is not iterable0outer[]1

'GEEKSFORGEEKS'
5
'GEEKSFORGEEKS'
3 TypeError: outer[] takes 0 positional arguments but 2 were given4

  • 'GEEKSFORGEEKS'
    8outer[]7
    'GEEKSFORGEEKS'
    04
  • 'GEEKSFORGEEKS'
    05 *args8
    'GEEKSFORGEEKS'
    1
    'GEEKSFORGEEKS'
    1
    'GEEKSFORGEEKS'
    09outer[]1
  • GEEKSFORGEEKS
    3 *args8
    'GEEKSFORGEEKS'
    1
    'GEEKSFORGEEKS'
    1 TypeError: 'function' object is not iterable0outer[]1

    'GEEKSFORGEEKS'
    5
    'GEEKSFORGEEKS'
    3 TypeError: outer[] takes 0 positional arguments but 2 were given4

    'GEEKSFORGEEKS'
    8outer[]7
    'GEEKSFORGEEKS'
    04

    'GEEKSFORGEEKS'
    05 *args8
    '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
    GEEKSFORGEEKS
    1

    'GEEKSFORGEEKS'
    8
    GEEKSFORGEEKS
    3
    GEEKSFORGEEKS
    4

    GEEKSFORGEEKS
    5
    GEEKSFORGEEKS
    6
    'GEEKSFORGEEKS'
    1
    GEEKSFORGEEKS
    8

    'GEEKSFORGEEKS'
    8outer[]0outer[]1

    GEEKSFORGEEKS
    5
    GEEKSFORGEEKS
    6
    'GEEKSFORGEEKS'
    1 outer[]5

    'GEEKSFORGEEKS'
    8outer[]7 outer[]8

    'GEEKSFORGEEKS'
    5outer[]7 TypeError: outer[] takes 0 positional arguments but 2 were given1

    TypeError: outer[] takes 0 positional arguments but 2 were given2

    'GEEKSFORGEEKS'
    3 TypeError: outer[] takes 0 positional arguments but 2 were given4

    'GEEKSFORGEEKS'
    5outer[]7 TypeError: outer[] takes 0 positional arguments but 2 were given7

    TypeError: outer[] takes 0 positional arguments but 2 were given8TypeError: outer[] takes 0 positional arguments but 2 were given9

    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
    GEEKSFORGEEKS
    1

    'GEEKSFORGEEKS'
    8
    GEEKSFORGEEKS
    3
    GEEKSFORGEEKS
    4

    GEEKSFORGEEKS
    5
    GEEKSFORGEEKS
    6
    'GEEKSFORGEEKS'
    1
    GEEKSFORGEEKS
    8

    'GEEKSFORGEEKS'
    5outer[]7 TypeError: outer[] takes 0 positional arguments but 2 were given1

    'GEEKSFORGEEKS'
    3 TypeError: outer[] takes 0 positional arguments but 2 were given4

    'GEEKSFORGEEKS'
    5
    'GEEKSFORGEEKS'
    3
    'GEEKSFORGEEKS'
    7

    'GEEKSFORGEEKS'
    8
    'GEEKSFORGEEKS'
    9
    'GEEKSFORGEEKS'
    1
    GEEKSFORGEEKS
    1

    'GEEKSFORGEEKS'
    8
    GEEKSFORGEEKS
    3
    GEEKSFORGEEKS
    4

    'GEEKSFORGEEKS'
    8outer[]7 outer[]8

    'GEEKSFORGEEKS'
    5outer[]7 TypeError: outer[] takes 0 positional arguments but 2 were given1

    'GEEKSFORGEEKS'
    3 TypeError: outer[] takes 0 positional arguments but 2 were given4

    'GEEKSFORGEEKS'
    5outer[]7 TypeError: outer[] takes 0 positional arguments but 2 were given7

    'GEEKSFORGEEKS'
    5TypeError: 'function' object is not iterable8

    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'
    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 given8TypeError: outer[] takes 0 positional arguments but 2 were given9

    Output:

    GEEKSFORGEEKS

    Bài Viết Liên Quan

    Chủ Đề