Trình trang trí điều kiện tiên quyết của Python

Nếu hàm được trang trí có thể được gọi với các đối số từ khóa thì tên của các đối số của điều kiện tiên quyết phải khớp với tên của hàm. Khi trang trí một phương thức lớp, điều kiện tiên quyết phải bao gồm đối số self

Nỗ lực khiêm tốn của tôi để lập mô hình điều kiện trước/hậu với
người trang trí. -) Đây cũng là thử nghiệm đầu tiên của tôi
với người trang trí.
Nếu bạn có bất kỳ ý tưởng hoặc suy nghĩ nào về cách
cải thiện đoạn mã, tôi rất sẵn lòng
tìm hiểu thêm.

Vui thích. -)

điều kiện xác định(pretext,posttext="").
precode=compile(pretext or "True","","eval")
postcode=compile(posttext or "True","","eval

# hàm -> được trang trí(chức năng)
def decor_condition(chức năng).
# KHẮC PHỤC. Không hoạt động với các chức năng được bao bọc
argcount=function. func_code. co_argcount
var=function. func_code. co_varnames[0. số đối số]

# đối số -> đóng (khẳng định)
def đánh giá_condition(*args,**kargs).
# KHẮC PHỤC. kiểm tra xem "var" có luôn chứa danh sách đối số được sắp xếp theo thứ tự
# đối số bản đồ và
args_seq=[(argname,args[pos]) cho pos,argname trong kiểu liệt kê . itervalues()]
# key-arguments to value
kargs_seq=[(k,v) for k,v in kargs.itervalues()]
environment=args_seq+kargs_seq

# điều kiện tiên quyết
khẳng định eval(precode,{},dict(environment)),pretext
tmp=function(*args,**kargs
environment2=environment+[('result',tmp)]

# postcondition
assert eval(postcode,{},dict(environment2)),posttext
return tmp

trả lại đánh giá_điều kiện

trả lại trang trí_điều kiện

@condition("number>0 and number
def sqrt(number).
nhập toán học
trả về toán học. sqrt(số)

@condition("danh sách(seq) không phải là Không","tổng(seq)==kết quả")
def my_sum(seq).
tmp=0
cho phần tử trong seq.
tmp+=element
return tmp

in sqrt(1. 2)
in my_sum([1,2,3])

18 Jul '05 #1

7

Trình trang trí điều kiện tiên quyết của Python
3144
Trình trang trí điều kiện tiên quyết của Python

Ngày 6 tháng 1 năm 2005 13. 33. 42 -0800, Rittersporn viết

@condition("number>0 and number
def sqrt(number).
nhập toán học
trả về toán học. sqrt(số)

@condition("danh sách(seq) không phải là Không","tổng(seq)==kết quả")
def my_sum(seq).
tmp=0
cho phần tử trong seq.
tmp+=element
return tmp

in sqrt(1. 2)
in my_sum([1,2,3])

Tôi nghĩ sẽ tốt hơn nếu các điều kiện trước và sau có thể biên dịch được

@condition((list(seq) is not Không có cho seq trong args), (sum(seq)==result
cho ((seq,), result) trong (

hoặc một cái gì đó ngớ ngẩn như thế

Cá nhân tôi thích cái này hơn.
@precondition(list(seq) is not Không có cho seq trong args)
@postcondition(sum(seq)==kết quả cho ((seq,),

(tất nhiên, đây là cách sử dụng công cụ thay thế lambda framehack được trình bày
trong một chuỗi khoảng một tuần trước).

Stephen.
Stephen.

18 Jul '05 #2

Xin chào Stephen
Tôi chưa đọc bất cứ điều gì về
"sự thay thế lambda framehack",
nhưng tôi . Cú pháp erros e. g.
postconditions. Syntax erros e.g.
sẽ tăng lên nếu mô-đun
được biên dịch. Mặc dù tôi phải thừa nhận
rằng đoạn mã của bạn trông giống
mã được biên dịch hơn ;-)

Xin chào Robert
cảm ơn bạn đã liên kết tới blog của Ian Bicking.

Xin chào George,
thật vui khi thấy bạn đã giải quyết
nhiệm vụ như thế nào.
Có thể một ngày nào đó chúng ta sẽ có một mô-đun trình kiểm tra
trong Python. ;-)

Chà, tôi đã đính kèm nỗ lực mới nhất của mình
để lập mô hình các điều kiện trước/sau (không có "framehack
lambda thay thế") bao bọc
original function with a class which delegates
attribute access. Now I can split my
"điều kiện" của mình thành tiền điều kiện và hậu điều kiện
và "trình đánh dấu" in tên hàm
gốc.
Tôi cũng đã sửa lỗi
với đối số từ khóa.
Sự khác biệt lớn so với
các ví dụ khác có lẽ
chỉ là tôi có thể tham khảo chức năng
arguments by name:

đại biểu lớp(đối tượng).
def __init__(bản thân,chức năng).
chính mình. function=function
def __getattr__(self,key).
return getattr(self. chức năng,khóa)
điều kiện xác định(pretext,posttext="").
precode=compile(pretext or "True","","eval")
postcode=compile(posttext or "True","","eval

# hàm -> được trang trí(chức năng)
def decor_condition(chức năng).
argcount=function. func_code. co_argcount
var=function. func_code. co_varnames[0. argcount]
lớp EvalCond(Đại biểu).
def __call__(self,*args,**kargs).
# KHẮC PHỤC. kiểm tra xem "var" có luôn chứa
danh sách đối số được sắp xếp theo thứ tự
# đối số bản đồ và
args_seq=[(argname,args[ . iteritems()]
pos,argname in \
enumerate(var) if (argname not
in kargs)]
# key-arguments to value
kargs_seq=[(k,v) for k,v in
kargs.iteritems()]
environment=args_seq+kargs_seq

# điều kiện tiên quyết
khẳng định
eval(precode,{},dict(environment),pretext
tmp

môi trường2=môi trường+[('kết quả',tmp)]

# postcondition
assert
eval(postcode,{},dict(environment2)),posttext
return
return EvalCond(function)
return decorate_condition

dấu vết xác định (chức năng).
Dấu vết lớp (Đại biểu).
def __call__(self,*args,**kargs).
in "nhập hàm %s bằng " % \
self. hàm số. func_name,args,kargs
result=self. function(*args,**kargs)
print "remove function %s with " % \
self. hàm số. func_name,args,kargs
kết quả trả về
trả về Trace(hàm)

điều kiện tiên quyết xác định(prgtext).
điều kiện trả về (prgtext)

def postcondition(prgtext).
điều kiện trả về("",prgtext)
@precondition("number>0 and number
@postcondition .
def sqrt(number):
nhập toán học
trả về toán học. sqrt(số)

@trace
@precondition("len(seq)>0 không phải là Không và str(more)")
@postcondition("sum .
def my_sum(seq,more):
tmp=0
cho phần tử trong seq.
tmp+=element
return tmp

in sqrt(1. 2)
in my_sum([1,2,3],more="more")

18 Jul '05 #3

Cám ơn rất nhiều. Nó thực sự là một đoạn mã rất tao nhã. -)

Eiffel (ngôn ngữ) có cả kiểm định loại và thiết kế theo hợp đồng.
Python thiếu cả hai.
Mô-đun của bạn xử lý việc kiểm tra loại, tôi
đã thử thực thi mã tùy ý trước
và sau khi thực thi chức năng để nhận ra
runtime assertions.

Tôi tự hỏi liệu điều này có nên được tách ra trong một
"checker"-mô-đun Python không.
Cả hai đều là một phần của "hợp đồng" giao diện.

chào

18 Jul '05 #5

Eiffel (ngôn ngữ) có cả kiểm định loại và thiết kế theo hợp đồng.
Python thiếu cả hai.

Thật ra, Python được gõ mạnh. Nó chỉ được nhập động thay vì
được nhập tĩnh.

Nhảy

18 Jul '05 #6

Thứ sáu, ngày 7 tháng 1 năm 2005 20. 01. 50 +0200, George Sakkis đã viết

Xin chào George,
thật vui khi thấy bạn đã giải quyết
nhiệm vụ như thế nào.
Có thể một ngày nào đó chúng ta sẽ có một mô-đun trình kiểm tra
trong Python. ;-)

Tôi đã đăng mô-đun của mình trên http. //rafb. net/dán/kết quả/voZYTG78. html và thử nghiệm đơn vị của nó trên
http. //rafb. mạng/dán/kết quả/MYxMQW95. html. Bất kỳ thông tin phản hồi sẽ được đánh giá cao.

Được đẹp

Các vấn đề chưa được giải quyết.
1) Bạn xử lý các loại vịt như thế nào, tôi. e. một phương thức chấp nhận StringIO,
cStringIO hoặc bất kỳ đối tượng nào khác có. đường đọc(),. seek() và
. read()?
2) Làm cách nào để tắt tính năng kiểm tra loại mã sản xuất?

Nếu không thì tôi khá thích nó. Hãy xuất bản nó ở đâu đó

Stephen

18 Jul '05 #7

Stephen Thornewrites

Các vấn đề chưa được giải quyết.
1) Bạn xử lý các loại vịt như thế nào, tôi. e. một phương thức chấp nhận StringIO,
cStringIO hoặc bất kỳ đối tượng nào khác có. đường đọc(),. seek() và
. read()?
Điều đó thực sự nên được thực hiện thông qua việc các lớp đó kế thừa một
mixin thao tác tệp hoặc cách khác thông qua các giao diện (có thể lấy
added to Python).
2) Làm cách nào để tắt tính năng kiểm tra loại mã sản xuất?

Nó nên được để trên. Để nó ở trạng thái phát triển rồi
tắt nó để sản xuất cũng giống như mặc một chiếc dù trong quá trình huấn luyện trên mặt đất
và tháo nó ra khi bạn đã ở trên không trung.

18 Jul '05 #8

Chủ đề thảo luận này đã bị đóng

Trả lời đã bị vô hiệu hóa cho cuộc thảo luận này

Điều kiện tiên quyết của Python là gì?

Điều kiện tiên quyết là điều gì đó phải đúng khi bắt đầu một hàm để hàm hoạt động chính xác . Hậu điều kiện là điều mà hàm đảm bảo là đúng khi nó kết thúc. Một bất biến là một cái gì đó luôn đúng tại một điểm cụ thể bên trong một đoạn mã.

Vi phạm điều kiện tiên quyết trong Python là gì?

Nếu một chức năng không hoạt động, có ba khả năng cần xem xét. Có điều gì đó không ổn với các đối số mà hàm nhận được ; . Có điều gì đó không ổn với chức năng; . Có điều gì đó không ổn với giá trị trả về hoặc cách nó đang được sử dụng.

Điều gì xảy ra nếu một điều kiện tiên quyết không được đáp ứng?

Khi điều kiện tiên quyết hoặc hậu điều kiện của chúng không được đáp ứng, các phương thức thường đưa ra ngoại lệ .

Gỡ lỗi điều kiện tiên quyết là gì?

Điều kiện tiên quyết là câu lệnh đặt trước phân đoạn . Nó phải đúng trước khi vào phân khúc để nó hoạt động chính xác. Điều kiện tiên quyết thường được đặt trước các vòng lặp hoặc tại điểm bắt đầu của các hàm và thủ tục. Một hậu điều kiện là một tuyên bố được đặt sau khi kết thúc phân đoạn.