Tôi cần thay đổi cuộc gọi đến hàm bên trong một hàm khác trong thời gian chạy.Thay đổi tham chiếu đến hàm trong thời gian chạy trong Python
Xét đoạn mã sau:
def now():
print "Hello World!"
class Sim:
def __init__(self, arg, msg):
self.msg = msg
self.func = arg
self.patch(self.func)
def now(self):
print self.msg
def run(self):
self.func()
def patch(self, func):
# Any references to the global now() in func
# are replaced with the self.now() method.
def myfunc():
now()
Sau đó ...
>>> a = Sim(myfunc, "Hello Locals #1")
>>> b = Sim(myfunc, "Hello Locals #2")
>>> b.run()
Hello Locals #2
>>> a.run()
Hello Locals #1
Một người dùng đã viết mã, myfunc()
, mà làm cho một cuộc gọi đến một hàm được định nghĩa toàn cầu now()
và tôi không thể chỉnh sửa nó . Nhưng tôi muốn nó gọi phương thức của ví dụ Sim
. Vì vậy, tôi sẽ cần phải "vá" chức năng myfunc()
trong thời gian chạy.
Làm cách nào để tôi thực hiện việc này?
Một giải pháp có thể là chỉnh sửa bytecode như đã hoàn thành tại đây: http://www.jonathon-vogel.com/posts/patching_function_bytecode_with_python/ nhưng tôi tự hỏi liệu có cách nào dễ hơn không.
Trong trường hợp sử dụng thực tế của bạn, là 'now' và' myfunc' được định nghĩa trong cùng một mô-đun với nhau không? Bạn có quan tâm nếu các tập quán khác của 'now' bị ảnh hưởng không? Nếu chúng nằm trong các mô-đun khác nhau, làm thế nào để 'myfunc' truy cập chức năng' now'? Cách tiếp cận được yêu cầu có thể khác đôi chút nếu nó thực hiện 'từ nhập khẩu somemodule bây giờ ... now()' vs 'import somemodule ... somemodule.now()'. – Weeble
Có, nó không quan trọng. Tôi đã cập nhật ví dụ về tài khoản này. Người dùng cuối sẽ nhập toàn bộ '' now'' và '' Sim'' từ một thư viện trong mã của họ. Tôi có thể sửa đổi '' now'' toàn cầu, nhưng tôi không thể đủ khả năng tra cứu tốn kém bên trong '' now'' toàn cầu để định vị một phiên bản cục bộ. – jpcgt