cuốn sách gpt4 ai đã làm

Có thể vá khỉ sâu bằng Python không?

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 03:39:25 27 4
mua khóa gpt4 Nike

看看这个bộ thay đổi cho Django .Tôi cần chức năng này, nhưng bản vá này là từ phiên bản 1.7 của Django và tôi không thể sử dụng nó trong môi trường của mình (chỉ Python 2.6). Vì vậy bây giờ tôi đã sao chép quản trị_viewphương pháp mã của tôi và sử dụng admin.site.admin_view = một phần(admin_view, admin.site) Tiêm nó.

Tuy nhiên, tôi muốn giữ số lượng mã "rẽ nhánh" ở mức tối thiểu và muốn biết: liệu có thể vá nó không, tức là thay thế tự.đăng nhậpchức năng chuyển hướng_đến_đăng nhậphiện hữubên trongđể thực thi chức năng trang trí trong phạm vi?

Tôi biết đây sẽ là một vụ hack độc ác, tuy nhiên, tôi muốn biết mình có thể đi được bao xa với Python.

câu trả lời hay nhất

django.contrib.admin.sites.inner = yourfunctionhere

biên tập:

Ồ. Tôi hơi xấu hổ vì đã để chuyện này ngồi đây lâu như vậy. Tôi nhớ lờ mờ bài viết của mình dựa trên cách thứ hai (xem bình luận bên dưới), nhưng tôi không nhớ đủ chi tiết để tìm lại. Vì vậy, tôi chỉ khuyên bạn nên phân lớp Trang web quản trị.


EDIT 2: Sau khi tìm kiếm, tôi tìm thấy cái này:

Có tồn tại tính năng ghi đè tương đương cho các hàm lồng nhau không?

Hàm "monkey_patch_fn" thực hiện chính xác những gì bạn muốn và hiển thị một cách tiếp cận khả thi. Nó có thể đầy đủ hoặc không.

Kế hoạch ban đầu của tôi là sửa đổi chức năng thông qua việc tháo gỡ, nhưng tôi vẫn gặp vấn đề với các thuộc tính ở chế độ chỉ đọc (tôi认为là những gì bài viết gốc của tôi đề cập đến)...nhưng tôi không thể tìm thấy nó).


Chỉnh sửa 3:

Sử dụng tên sự chơi phụ Mô-đun đã tìm thấy một cách khác. Tôi mừng vì mình đã không bỏ cuộc nhanh thế. Tôi thích cách này hơnrất nhiều. Nó có lẽ cũng khá rắc rối, nhưng tôi tin rằng một mô-đun được xuất bản hoàn chỉnh sẽ thận trọng hơn một câu trả lời ngẫu nhiên cho một vấn đề cụ thể.

Dẫu sao thì. Vì tôi không muốn xem mã Django ngay bây giờ nên tôi sẽ cung cấp một ví dụ đủ. Đầu tiên là thiết lập.

từ nhập byteplay *
nhập khẩu

kiểm tra chắc chắn():
def printone():
in 1
printone()

def printtwo():
in 2

dis.dis(kiểm tra)

Đầu ra ở đây là

  2 0 LOAD_CONST 1 (", dòng 1>)
3 MAKE_FUNCTION 0
6 CỬA HÀNG_FAST 0 (in)

4 9 LOAD_FAST 0 (in)
12 GỌI_CHỨC NĂNG 0
15 POP_TOP
16 LOAD_CONST 0 (Không có)
19 RETURN_VALUE

Vì vậy, sau đó chúng tôi sử dụng sự chơi phụ chuyển đổi nó thành Code đối tượng, chỉnh sửa nó và biến nó trở lại mã byte bình thường.

mã kiểm tra = Code.from_code(test.__code__)
in testcode.code

Đầu ra là:

[(SetLineno, 2), (LOAD_CONST, <đối tượng="" byteplay.code="" tại="" 0x7f72096e6a50="">), (MAKE_FUNCTION, 0), (STORE_FAST, 'printone'), (SetLineno, 4), (LOAD_FAST, 'printone'), (CALL_FUNCTION , 0), (POP_TOP, Không có), (LOAD_CONST, Không có), (RETURN_VALUE, Không có)]

nó phản ánh dis. Vì vậy, chúng ta chỉ cần thay đổiCodeđối tượng và đặt mã mới vào đối tượng ban đầu.

testcode.code[1] = (LOAD_CONST, Code.from_code(printtwo.__code__))
test.__code__ = testcode.to_code()
dis.dis(kiểm tra)
Bài kiểm tra()

Đầu ra hơi lộn xộn, nhưng chúng tôi thấy:

  5 0 LOAD_CONST 1 (<đối tượng="" mã="" printtwo="" tại="" 0x7fc668476230,="" tệp="" "byteplaytest.py",="" dòng="" 9="">)
3 MAKE_FUNCTION 0
6 CỬA HÀNG_FAST 0 (in)

7 9 LOAD_FAST 0 (in)
12 GỌI_CHỨC NĂNG 0
15 POP_TOP
16 LOAD_CONST 0 (Không có)
19 RETURN_VALUE
2

Vì vậy chúng tôi đang tải printhai hàm, hãy lưu nó dưới dạng tên biến cục bộ bản in chức năng bên dưới, và sau đó là cuối cùng 2 Nó vừa được gọi thành công printhai 函数。

Điều này sẽ cung cấp một lời giải thích toàn diện về những gì bạn cần làm. Bạn sẽ cần phải sử dụng dis để xác định dòng nào trong mã byte bạn cần thay đổi, nhưng tôi nghĩ bạn chỉ nên thay đổi LOAD_CONST. Tất nhiên là tôi chưa thử cái này trên thư viện hay bất cứ thứ gì... nhưng nếu có bất kỳ vấn đề nào, vui lòng cho tôi biết.

Giới thiệu về python - Python có thể vá lỗi sâu cho khỉ không? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/27233460/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress