Nhận chữ ký chức năng

Bài viết đăng tại: https://programming.laptrinh.site

Hướng dẫn này sẽ thảo luận về một số phương pháp để nhanh chóng nhận được chi tiết lệnh gọi hàm bằng Python. Điều này đặc biệt hữu ích khi phân tích một cơ sở mã lớn và việc tìm ra chức năng đang thực hiện trong nháy mắt trở nên khó khăn.

Thay vì quay đi quay lại mã, chúng tôi có các giải pháp thông minh hơn cho vấn đề chính xác này bằng cách sử dụng các hàm và bộ trang trí signature() .

Sử dụng signature() để nhận chi tiết cuộc gọi chức năng trong Python

Cách dễ nhất để lấy thông tin này là sử dụng inspect.signature() . Tài liệu dành cho Python 3.5+ khuyến nghị sử dụng chức năng này.

inspect.signature() chấp nhận nhiều loại có thể gọi được. Điều này bao gồm các hàm, lớp và các đối tượng functools.partial() .

Hàm trả về chú thích có thể gọi được. Nếu không có chữ ký nào được cung cấp, hàm sẽ tạo ra ValueError ; nếu loại đối tượng không được hỗ trợ, nó sẽ phát sinh TypeError .

Mã ví dụ:

import inspect
def foo (x, y, a = "anything" ): pass
print (inspect . signature(foo))

Nó sẽ in phần sau trên thiết bị đầu cuối của bạn.

(x, y, a="anything")

Sử dụng Trình trang trí để nhận chi tiết cuộc gọi chức năng trong Python

Các hàm trong Python có một vài thuộc tính mà chúng ta có thể sử dụng. Trong số các thuộc tính này là __code__ .

Thuộc tính __code__ còn có các thuộc tính mà chúng ta có thể sử dụng. Dưới đây, bạn có thể tìm thấy từng người trong số họ được liệt kê, giải thích những gì họ làm.

Bên dưới đó, chúng tôi sẽ bao gồm một đoạn mã để viết chức năng của bạn có thể thực hiện tác vụ này. Chúng ta sử dụng thuộc tính __name__ để lấy tên hàm.

  1. co_varnames trả về một bộ tên của các đối số được truyền cho hàm và các biến cục bộ được sử dụng bên trong hàm.

  2. co_argcount trả về số đối số. Tuy nhiên, số lượng này không bao gồm các đối số chỉ có từ khóa ( kwargs ), *args**args .

    Chúng tôi đã bao gồm một cách để in tất cả các đối số này trong đoạn mã của chúng tôi.

def get_func_dets(func):
	# the point of using argcount is to ensure we only get
	argument_names = func.__code__.co_varnames[:func.__code__.co_argcount]
	func_name = func.__name__

	# getting variable length arguments and keyword arguments
	def inner_fun(*args, **kwargs):
		print(func_name, "(", end = "")

		print(", ".join('%s = %r' % ent
			for ent in zip(argument_names, args[:len(argument_names)])), end=", ")

		print("args = ", list(args[len(argument_names):]), end=",")
		print("kwargs =", kwargs, end="")
		print(")")

	return inner_func

URL Link

https://laptrinh.site/nhan-chu-ky-chuc-nang/

Viết bởi Duy Mạnh. Đã đăng ký bản quyền tác giả tại Creativecommons và DMCA