Phương thức trừu tượng python với các tham số khác nhau

Ăn kiêng Maurer

2020-08-25 17. 21. 54 UTC

liên kết cố định

Bài đăng của Samuel Marks
Sau cuộc thảo luận về #python trên Freenode, tôi ở đây.

Falc - Chữ ký của phương thức 'Pharm. foo[]' không khớp với chữ ký của phương thức cơ sở trong lớp 'Base'

What's the right way of specialising the children and leaving the Base
pretty much empty?
• All implementers to be forced to implement Base's method
• Base to be able to do very basic things with kwargs, namely log it
[to a file like stdout or a db]
• Support for [at least] Python 3.6–3.9 [I don't think `Protocol` has
been backported?]
• Implementors to have access to the proper name, rather than having
to unpack kwargs
Should I be using a Base class? - Metaclass? - Something else
entirely? - I know giving `b` a default value would resolve the
[PyCharm] linter error… but I want it to be a required argument.
from abc import ABC, abstractmethod
@abstractmethod
...
...

Python phân biệt giữa đối số vị trí và từ khóa
. Một đối số vị trí được xác định bởi
vị trí của nó trong danh sách tham số; .
identified by its name.

`**` giới thiệu đối số từ khóa tùy ý. Trong một cuộc gọi, tất cả
các đối số đó phải được chuyển dưới dạng "tên=giá trị".
Trong trường hợp của bạn ở trên, `b` không phải là đối số từ khóa và do đó
không khớp với `**kwargs`. Lỗi bạn quan sát là chính đáng.

Bạn có thể thử.

cơ sở lớp[ABC].
@abstractmethod
def foo[self, a, *args, **kwargs].
.

lớp Dược phẩm [Cơ sở].
def foo[self, a, b, *args, **kwargs].
.


Lưu ý rằng chữ ký của phương thức cơ sở cho phép các đối số vị trí tùy ý
và từ khóa. Do đó, các phương thức dẫn xuất phải
giống nhau.

Nếu đây không phải là điều bạn muốn, bạn có thể muốn khám phá
việc sử dụng trình trang trí hoặc lớp meta thay vì lớp cơ sở.

Samuel Marks

2020-08-27 05. 58. 11 giờ UTC

liên kết cố định

Điều chính tôi muốn là loại an toàn. Tôi muốn Python khiếu nại nếu
callee sử dụng sai loại đối số và cung cấp đề xuất
những gì cần thiết và thông tin về nó.

Không có lớp cơ sở, tôi chỉ có thể có chuỗi tài liệu và nhập chú thích
để đạt được điều đó.

Tôi có thể sử dụng cái gì để yêu cầu tất cả những người triển khai phải có tối thiểu
các thuộc tính và đối số giống nhau, đồng thời cho phép họ thêm mới
properties and arguments?

Preferably I would like this all to happen before compile/interpret
time. This also opens it up to AST driven stub generation; as can be
found in various IDEs [and also a little project I wrote that `import
ast`].

Tôi có những lựa chọn nào ở đây? . // khoa học sydney. tổ chức>. tư vấn
decorator approaches will help here…

Samuel Marks
Charity | consultancy
| open-source |
LinkedIn

Bài đăng của Samuel Marks
Sau cuộc thảo luận về #python trên Freenode, tôi ở đây.

Falc - Chữ ký của phương thức 'Pharm. foo[]' không khớp với chữ ký của phương thức cơ sở trong lớp 'Base'

What's the right way of specialising the children and leaving the Base
pretty much empty?
• All implementers to be forced to implement Base's method
• Base to be able to do very basic things with kwargs, namely log it
[to a file like stdout or a db]
• Support for [at least] Python 3.6–3.9 [I don't think `Protocol` has
been backported?]
• Implementors to have access to the proper name, rather than having
to unpack kwargs
Should I be using a Base class? - Metaclass? - Something else
entirely? - I know giving `b` a default value would resolve the
[PyCharm] linter error… but I want it to be a required argument.
from abc import ABC, abstractmethod
@abstractmethod
...
...

Python make a distinction between positional and keyword
arguments. A positional argument is identified by its
position in the parameter list; a keyword argument is
identified by its name.

`**` introduces arbitrary keyword arguments. In a call, all
those arguments must be passed as "name=value".
In your case above, `b` is not a keyword argument and thus
is not matched by `**kwargs`. The error you observe is justified.

You can try:

class Base[ABC]:
@abstractmethod
def foo[self, a, *args, **kwargs]:
...

class Pharm[Base]:
def foo[self, a, b, *args, **kwargs]:
...


Note that the base method signature allows arbitrary positional
and keyword arguments. As a consequence, derived methods must do
the same.

If this is not what you want, you might want to explore
the use of a decorator or a meta class rather than a base class.

Ăn kiêng Maurer

2020-08-27 17. 51. 13 giờ UTC

liên kết cố định

Bài đăng của Samuel Marks
Điều chính tôi muốn là loại an toàn. Tôi muốn Python khiếu nại nếu
callee sử dụng sai loại đối số và cung cấp đề xuất
những gì cần thiết và thông tin về nó.
Không có lớp cơ sở, tôi chỉ có thể có chuỗi tài liệu và nhập chú thích
để đạt được điều đó.
Tôi có thể sử dụng cái gì để yêu cầu tất cả những người triển khai phải có tối thiểu
các thuộc tính và đối số giống nhau, đồng thời cho phép họ thêm mới
properties and arguments?

Mô hình chính của lập trình hướng đối tượng là
khả năng sử dụng một thể hiện của lớp dẫn xuất chỉ với kiến ​​thức
về lớp cơ sở. Điều này ngụ ý rằng trong nhiều trường hợp, bạn
không cần biết lớp cụ thể vì bất kỳ thể hiện nào của
lớp dẫn xuất đều phải có hành vi thiết yếu của các thể hiện của lớp cơ sở.

Mô hình này áp đặt các hạn chế đối với những thay đổi chữ ký được phép.
Một phương thức ghi đè có thể thêm các tham số khác nhưng tất cả các tham số đó
phải có giá trị mặc định - nếu không, việc sử dụng với kiến ​​thức của lớp cơ sở
.

Bài đăng của Samuel Marks
Tốt nhất là tôi muốn tất cả điều này xảy ra trước khi biên dịch/thông dịch

time.

Use a "lint" version to check compatibilty.

Samuel Marks

2020-08-29 09. 14. 54 UTC

liên kết cố định

Vì vậy, không có cách nào để gặp lỗi AOT khi hai hàm không
được triển khai, nếu hai hàm có các đối số bắt buộc khác nhau trên
0

…và việc triển khai là.

lớp TensorFlow[Base].
def training[self, learning_rate, epochs, callbacks, dimensions, loss, Optimizer].
siêu[Cơ sở, bản thân]. __init__[epochs=epochs]

[+ chuỗi tài liệu và loại PEP484; .

So how do I enable this use-case? - Obviously it doesn't make sense to
include these on the base class, and giving them default values
probably doesn't make sense either.

Bạn đang nói rằng tôi không nên sử dụng ABC cho việc này. Vậy tôi nên sử dụng cái gì?
Yêu cầu mà tôi đang cố gắng thực thi là mỗi người triển khai đều có
`train` có thể gọi được đính kèm.
Tốt hơn là có một trường bắt buộc [nhưng đây chỉ là một trường tốt để có].

BTW. Tôi đã kích hoạt trường hợp sử dụng kế thừa đối số thông qua việc tạo
một thư viện với mô-đun `ast` dựng sẵn. Vì vậy, bây giờ bạn có thể có `def
train_c[self, config]` với cấu hình đề cập đến một thể hiện của lớp
kế thừa từ lớp cấu hình cơ sở. Xem tại đây để biết
cách triển khai https. //github. com/SamuelMarks/doctrans

Tuy nhiên, nếu tôi chỉ có các hàm chấp nhận một thể hiện của một lớp
làm đối số, thì điều đó sẽ khiến nó kém thân thiện hơn với người dùng . Vì vậy, tôi thực sự đang tìm cách xử lý cả hai giao diện theo cách
caller. So I really am looking for handling both interfaces in a
đơn giản.

Cảm ơn đề xuất của bạn,

Samuel Marks
Tổ chức từ thiện
| open-source |
LinkedIn

Bài đăng của Dieter Maurer

Bài đăng của Samuel Marks
Điều chính tôi muốn là loại an toàn. Tôi muốn Python khiếu nại nếu
callee sử dụng sai loại đối số và cung cấp đề xuất
những gì cần thiết và thông tin về nó.
Không có lớp cơ sở, tôi chỉ có thể có chuỗi tài liệu và nhập chú thích
để đạt được điều đó.
Tôi có thể sử dụng cái gì để yêu cầu tất cả những người triển khai phải có tối thiểu
các thuộc tính và đối số giống nhau, đồng thời cho phép họ thêm mới
properties and arguments?

Mô hình chính của lập trình hướng đối tượng là
khả năng sử dụng một thể hiện của lớp dẫn xuất chỉ với kiến ​​thức
về lớp cơ sở. Điều này ngụ ý rằng trong nhiều trường hợp, bạn
không cần biết lớp cụ thể vì bất kỳ thể hiện nào của
lớp dẫn xuất đều phải có hành vi thiết yếu của các thể hiện của lớp cơ sở.
Mô hình này áp đặt các hạn chế đối với những thay đổi chữ ký được phép.
Một phương thức ghi đè có thể thêm các tham số khác nhưng tất cả các tham số đó
phải có giá trị mặc định - nếu không, việc sử dụng với kiến ​​thức của lớp cơ sở
.

Bài đăng của Samuel Marks
Tốt nhất là tôi muốn tất cả điều này xảy ra trước khi biên dịch/thông dịch

time.
Use a "lint" version to check compatibilty.

Ăn kiêng Maurer

2020-08-29 10. 24. 30 UTC

liên kết cố định

Bài đăng của Samuel Marks
Vì vậy, không có cách nào để gặp lỗi AOT khi hai chức năng không
được triển khai, nếu hai chức năng . __init__[epochs=epochs]
implementors?
@abstractclass
asset epochs is not None and epochs > 0
super[Base, self].__init__[epochs=epochs]
[+ chuỗi tài liệu và loại PEP484; .
So how do I enable this use-case? - Obviously it doesn't make sense to
include these on the base class, and giving them default values
probably doesn't make sense either.
Bạn đang nói rằng tôi không nên sử dụng ABC cho việc này. Vậy tôi nên sử dụng cái gì?

Mục đích của bạn khi sử dụng lớp cơ sở ngay từ đầu là gì --
và đặc biệt là lớp trong đó `train` có chữ ký này?

Bạn .
call `train` with a single positional argument.
Nhưng `train` trong lớp dẫn xuất không thể được gọi theo cách này.

Các lớp cơ sở có sẵn để nắm bắt các đặc điểm chung của một số
các lớp có liên quan. Trong ví dụ của bạn ở trên, đây không phải là trường hợp.
Không sử dụng các lớp cơ sở theo cách này.

Bài đăng của Samuel Marks
Yêu cầu mà tôi đang cố gắng thực thi là mỗi người triển khai đều có
`train` có thể gọi được đính kèm.
Tốt hơn là có một trường bắt buộc [nhưng đây chỉ là một trường tốt để có].

Đọc tài liệu Python về siêu dữ liệu và các phương thức đặc biệt
liên quan đến dẫn xuất lớp. Cả hai phương pháp đều cho phép bạn
kiểm tra bất cứ điều gì bạn muốn.

Bài đăng của Samuel Marks
.
Tuy nhiên, nếu tôi chỉ có các hàm chấp nhận một thể hiện của một lớp
làm đối số, thì điều đó sẽ khiến API trở nên ít thân thiện hơn với người dùng
caller. So I really am looking for handling both interfaces in a
đơn giản.

Any system makes some things easy and other things difficult.
Try to stay with the essential paradigms underlaying the system --
in order to use the easy things whenever possible.

In your case, this means that the signature of an overriding
method must be quite similar to that of the overridden method.

Samuel Marks

2020-08-29 10. 46. 19 UTC

liên kết cố định

Đặt nguyên tắc thay thế Liskov sang một bên, tôi có một đề xuất
làm theo PEP 3102 và thực hiện `def train[self, *, epochs]. `…


Đó là một gợi ý khá đơn giản mà tôi có thể tham gia.

Đáp lại Dieter.
Mục đích của tôi khi sử dụng lớp cơ sở là để giao diện
cấp cao nhất—chẳng hạn như API CLI, GUI, REST và RPC—đều có thể được định cấu hình trong< .
one place, but enable the greatest possible divergence from a
parameter standpoint.

Một giải pháp thay thế ở đây [trong miền này] là tạo một
Keras/scikit mới. học hỏi. Tôi. e. , một giao diện nhất quán sẽ được
triển khai đầy đủ theo từng khung.

Có nhiều lý do khiến tôi không muốn sử dụng giải pháp thay thế này, vì tôi
không cần phải vào đây [rất vui được bắt đầu một chủ đề mới nếu .
interested].

Hai ưu điểm chính của phương pháp này là.
0. Những người triển khai có thể [khá nhiều] khác nhau như họ muốn, với
các tham số bắt buộc và mặc định khác nhau; . Người triển khai không cần tạo API CLI, GUI, REST và RPC của riêng họ
I do have `assert`s to force `method0` to be executed before
`method1`];
1. Implementers don't need to create their own CLIs, GUIs, REST and RPC APIs

Hai nhược điểm chính.
0. Các thông số không được biết trước, vì vậy bạn có thể thực hiện toàn bộ thủ thuật
`Animal` [loại vịt] trong đó `Animal` thực sự có thể là `Chó` hoặc
`Horse` [making the obvious Base `ABC` & `abstractmethod` approach
'wrong']
1. Each implementer framework can maintain wildly different internal
API nội bộ cực kỳ khác nhau, tạo ra nhiều tích hợp phức tạp hơn—theo nghĩa đa ML—khó khăn hơn nhiều
difficult

Samuel Marks
Charity | consultancy
| open-source |
LinkedIn

Bài đăng của Dieter Maurer

Bài đăng của Samuel Marks
Vì vậy, không có cách nào để có được AOT . __init__[epochs=epochs]
implemented, if the two functions have different required arguments on
implementors?
@abstractclass
asset epochs is not None and epochs > 0
super[Base, self].__init__[epochs=epochs]
[+ chuỗi tài liệu và loại PEP484; .
So how do I enable this use-case? - Obviously it doesn't make sense to
include these on the base class, and giving them default values
probably doesn't make sense either.
Bạn đang nói rằng tôi không nên sử dụng ABC cho việc này. Vậy tôi nên sử dụng cái gì?

Mục đích của bạn khi sử dụng lớp cơ sở ngay từ đầu là gì --
và đặc biệt là lớp trong đó `train` có chữ ký này?
Bạn .
call `train` with a single positional argument.
Nhưng `train` trong lớp dẫn xuất không thể được gọi theo cách này.
Các lớp cơ sở có sẵn để nắm bắt các đặc điểm chung của một số
các lớp có liên quan. Trong ví dụ của bạn ở trên, đây không phải là trường hợp.
Không sử dụng các lớp cơ sở theo cách này.

Bài đăng của Samuel Marks
Yêu cầu mà tôi đang cố gắng thực thi là mỗi người triển khai đều có
`train` có thể gọi được đính kèm.
Tốt hơn là có một trường bắt buộc [nhưng đây chỉ là một trường tốt để có].

Đọc tài liệu Python về siêu dữ liệu và các phương thức đặc biệt
liên quan đến dẫn xuất lớp. Cả hai phương pháp đều cho phép bạn
kiểm tra bất cứ điều gì bạn muốn.

Bài đăng của Samuel Marks
.
Tuy nhiên, nếu tôi chỉ có các hàm chấp nhận một thể hiện của một lớp
làm đối số, thì điều đó sẽ khiến API trở nên ít thân thiện hơn với người dùng
caller. So I really am looking for handling both interfaces in a
đơn giản.

Any system makes some things easy and other things difficult.
Try to stay with the essential paradigms underlaying the system --
in order to use the easy things whenever possible.
In your case, this means that the signature of an overriding
method must be quite similar to that of the overridden method.

Dennis Lee Bieber

2020-08-27 14. 41. 57 UTC

liên kết cố định

Bài đăng của Samuel Marks
Tôi có thể sử dụng điều gì sẽ yêu cầu tất cả những người triển khai phải có tối thiểu
các thuộc tính và đối số giống nhau, nhưng cũng cho phép
properties and arguments?

Tôi nghĩ bạn sẽ yêu cầu người triển khai tách ra "thuộc tính và đối số
mới" của họ trước khi gọi super[] trên phần còn lại. Đó là
-- họ sẽ cần đóng gói lại các đối số vị trí và từ khóa để
chỉ những đối số mà lớp cơ sở của bạn được thiết kế để chấp nhận mới được cung cấp cho nó.

Bài đăng của Samuel Marks
Tốt nhất là tôi muốn tất cả điều này xảy ra trước khi biên dịch/thông dịch
thời gian. Điều này cũng mở ra khả năng tạo sơ khai do AST điều khiển; .
found in various IDEs [and also a little project I wrote that `import
ast`].

Trừ khi bạn đang chạy một "linter" bên ngoài, không có gì có thể xảy ra trước khi
"biên dịch".

Bài đăng của Samuel Marks
Tôi có những lựa chọn nào ở đây?
decorator approaches will help here…

Hãy nhớ rằng, trong Python, ngay cả siêu dữ liệu và trình trang trí cũng bị "thực thi".

Bài đăng của Samuel Marks
Samuel Marks
Tổ chức từ thiện
| open-source |
LinkedIn

Bài đăng của Samuel Marks
Sau cuộc thảo luận về #python trên Freenode, tôi ở đây.

Falc - Chữ ký của phương thức 'Pharm. foo[]' không khớp với chữ ký của phương thức cơ sở trong lớp 'Base'

What's the right way of specialising the children and leaving the Base
pretty much empty?
• All implementers to be forced to implement Base's method
• Base to be able to do very basic things with kwargs, namely log it
[to a file like stdout or a db]
• Support for [at least] Python 3.6–3.9 [I don't think `Protocol` has
been backported?]
• Implementors to have access to the proper name, rather than having
to unpack kwargs
Should I be using a Base class? - Metaclass? - Something else
entirely? - I know giving `b` a default value would resolve the
[PyCharm] linter error… but I want it to be a required argument.
from abc import ABC, abstractmethod
@abstractmethod
...
...

Python make a distinction between positional and keyword
arguments. A positional argument is identified by its
position in the parameter list; a keyword argument is
identified by its name.
`**` introduces arbitrary keyword arguments. In a call, all
those arguments must be passed as "name=value".
In your case above, `b` is not a keyword argument and thus
is not matched by `**kwargs`. The error you observe is justified.
@abstractmethod
...
...
Note that the base method signature allows arbitrary positional
and keyword arguments. As a consequence, derived methods must do
the same.
If this is not what you want, you might want to explore
the use of a decorator or a meta class rather than a base class.

--
Wulfraed Dennis Lee Bieber AF6VN
***@ix. netcom. com http. //wlfraed. đa dạng vi mô. giải phóng. tổ chức/

Phương thức trừu tượng có thể lấy tham số không?

Có, chúng ta có thể cung cấp các tham số cho phương thức trừu tượng nhưng phải cung cấp cùng loại tham số cho các phương thức đã triển khai mà chúng ta đã viết trong các lớp dẫn xuất.

Bạn có thể có một tham số có kiểu là một lớp trừu tượng không?

Lớp trừu tượng không thể được sử dụng làm loại tham số , kiểu trả về hàm hoặc loại chuyển đổi rõ ràng và không được khai báo đối tượng của lớp trừu tượng.

Lớp trừu tượng có thể có thuộc tính Python không?

Lớp trừu tượng trong Python cũng cung cấp chức năng của các thuộc tính trừu tượng bên cạnh các phương thức trừu tượng . Thuộc tính là cách Pythonic sử dụng getters và setters. Mô-đun abc có trình trang trí @abstractproperty để sử dụng các thuộc tính trừu tượng.

Phương thức trừu tượng có thể được ghi đè lên Python không?

Theo nhiều cách ghi đè một phương thức trừu tượng từ lớp cha và thêm hoặc thay đổi chữ ký của phương thức về mặt kỹ thuật không được gọi là ghi đè phương thức gì bạn . Ghi đè phương thức luôn ghi đè chữ ký phương thức hiện có cụ thể trong lớp cha.

Chủ Đề