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

python cmd.Cmd tự động thêm lệnh

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

Tôi đang cố gắng xây dựng một khung công tác cli nơi các lệnh cần được thêm động. Điều tôi muốn đạt được là - Tôi sẽ có một lớp tối thiểu kế thừa từ cmd.Cmd và sau này tôi sẽ viết các lệnh trong các lớp riêng biệt và tải các lệnh này cùng với lớp chính.

Dưới đây là những gì tôi đã thử nhưng khi thử thực hiện lệnh showmore thì nó báo TypeError

nhập cmd

lớp MyExtraCmds(cmd.Cmd):

def do_showmore(self, *args):
in(loại(tự))
print("Hiển thị thêm lệnh")

lớp MyCmd(cmd.Cmd):

def __init__(self, target=None, user=None, passwd=None):
cmd.Cmd.__init__(tự)

def do_show(self, *args):
in(loại(tự))
print("Hiển thị lệnh")

def do_EOF(tự, dòng):
trả về Đúng

if __name__ == "__main__":
setattr(MyCmd, 'do_showmore', MyExtraCmds.do_showmore)
in(dir(MyCmd))
mục tiêu = MyCmd()
target.cmdloop()

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

EDIT 2: Tôi nghĩ bạn phải sử dụng Python 2 vì trong Python 3, điều này chỉ hoạt động...

MyExtrasCommand là một lớp khác nên lớp này sẽ không hoạt động vì với InstanceMethod bình thường, đối số đầu tiên phải là một thể hiện của lớp đó.

Nhưng lớp Pythonđang mở;Bạn có thể thêm nó sau. Cách dễ nhất là bắt đầu với các phương thức hiện không có trong lớp và sau đó thêm chúng vào lớp một cách chính xác khi chạy. Ví dụ: điều này hoạt động tốt:

nhập cmd

def do_showmore(self, *args):
in(loại(tự))
print("Hiển thị thêm lệnh")

lớp MyCmd(cmd.Cmd):

def __init__(self, target=None, user=None, passwd=None):
cmd.Cmd.__init__(tự)

def do_show(self, *args):
in(loại(tự))
print("Hiển thị lệnh")

def do_EOF(tự, dòng):
trả về Đúng

if __name__ == "__main__":
setattr(MyCmd, 'do_showmore', do_showmore)
in(dir(MyCmd))
mục tiêu = MyCmd()
target.cmdloop()

Nếu bạn in loại MyCmd.do_showmore, bạn sẽ thấy hàm của bạn được gói chính xác vào InstanceMethod.

Chỉnh sửa (Chỉ trích dẫn - bạn có thểkhông thực sựMuốn làm điều này...)

Vì mọi thứ trong Python đều mở và có thể kiểm tra được nên bạnCó thểLàm cho phương thức ban đầu hoạt động bằng cách thay đổi một dòng. Phần sau đây sẽ chạy trong Python 2.7:

setattr(MyCmd, 'do_showmore', MyExtraCmds.do_showmore.im_func)

Đối với Python 2.7, đây sẽ là .im_func được thêm vào cuối dòng có nghĩa là "Lấy hàm cơ bản từ phương thức không liên kết MyExtraCmds.do_showmore và sử dụng nó." Tôi đề cập đến điều này vì đôi khi có những lý do chính đáng để sử dụng thuật toán đen tối như vậy. Nhưng trường hợp sử dụng bạn mô tả có vẻ không phù hợp ở đây và ví dụ: nếu bạn hỏi MyExtraCmds Đã thêm các biến lớp bổ sung và dự kiến do_showmore để truy cập chúng. bạn đến từ MyExtraCmds loại bỏ và thêm vào MyCmd Các chức năng trong sẽ không còn được hiểu nữa MyExtraCmds, do đó gây hiểu lầm và khó hiểu.

Về việc thêm động các lệnh bằng python cmd.Cmd, 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/31900083/

31 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
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