Вывод Python - PullRequest
       21

Вывод Python

0 голосов
/ 04 июля 2018

Я новичок в python, но не в программировании. Есть ли способ узнать, имеют ли два объекта одинаковые функции и поля?

У меня есть этот сценарий

var1 = func1()
var2 = func2()
func3(var1)
func3(var2)

И func1, и func2 - это функции в библиотеке, которую я использую, у которой практически нет документации.

Существует высокая вероятность того, что var1 и var2 являются объектами одного типа, но как я могу быть уверен?

Скажите, что я знаю, что func3(var1) работает, есть ли способ узнать, будет ли он работать с var2?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Первый , Python часто использует типизирование утки : если объект имеет требуемые свойства и методы, его можно использовать. Вы можете проверить так:

if hasattr(var2, 'method_name'):
   ... your code ...

Другой способ реализации типизации воздуховода неявный. Например, если ваша функция увеличивает свой аргумент, вы можете не проверять аргумент, а просто написать:

result = int(var1) + 1

И если var1 не может быть приведен к int, пользователь получит вполне читаемую ошибку:

TypeError: int() argument must be a string or a number, not 'MyCustomClass'

Второй , вы можете явно проверить , если var является экземпляром некоторого класса (или его потомка). Если вы знаете, что var1 является экземпляром dict:

if isinstance(var2, dict):
    ... your code ...

Этот код будет работать, если var2 является экземпляром dict, defaultdict или другим подклассом dict.

Вывод : нет единой квитанции проверяющих параметров. Вы всегда должны соблюдать баланс между защитой от недопустимых значений атрибутов и удобочитаемостью кода. Представьте, что вы пользователь, который вызывает вашу функцию: будет ли очевидно, какой тип должны иметь аргументы? Если вы передадите неправильное значение, будет ли понятна ошибка?

0 голосов
/ 04 июля 2018

Есть ли способ узнать, имеют ли два объекта одинаковые функции и поля?

Технически да, хотя я бы не рекомендовал это. Вы можете сравнить результаты вызова dir для каждого.

if dir(var1) == dir(var2):
    # both have the same attributes

Однако я все еще не рекомендую это из-за того, насколько это хрупко. Если и var1, и var2 реализуют функцию с именем frobnicate, но определяют ее совершенно по-разному, dir не сможет узнать, что они разные.

Чуть лучше сравнивать типы:

if type(var1) == type(var2):
    # both are objects of the same type

Но это не поможет , поскольку наличие одного и того же типа не гарантирует, что они будут иметь одинаковые атрибуты.

Скажите, что я знаю, что func3(var1) работает, есть ли способ узнать, будет ли он работать с var2

if var1 is var2:
    # it'll work

Это действительно так. Если оба var1 и var2 являются одним и тем же объектом, то вы знаете, что он будет работать одинаково. Любой другой ответ основывается на определении func3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...