2016-02-10 2 views
0

Я хочу создать класс, который требует определенного метода, с определенными типизированными аргументами и возвращаемыми значениями. Я могу наследовать от абстрактного класса, который требует, чтобы метод был реализован, но у меня нет возможности форсировать определенные значения аргументов и возвращать значения ala статический язык, такой как Java (я мог бы выпустить ошибку во время выполнения, если захочу) , Каков наилучший способ приблизиться к этому с Python? Заглянули в тип, намекая немного, но я не думаю, что он решает эту проблему.Как обеспечить интерфейс метода с Python?

+1

Если вам действительно нужно это, вы можете проверить MyPy: http://mypy-lang.org/, но я не думаю, что эта функция существует в CPython. Тип намека - самая близкая вещь. –

+0

Да, я не был уверен, возможно ли это. Я думал, что MyPy - это какой тип намека на Python 3 основывался? Или, может быть, они только портировали его часть. – Andrew

+2

Вы правы, PEP-484 основан на MyPy. Боюсь, что вы используете неправильный язык, если вы хотите, чтобы во время выполнения команды вводился параметр. Python просто не делает этого, не добавляя явные 'isinstance' проверки на метод. – chepner

ответ

1

Это кажется принципиально непитоническим. В python нет ввода параметров функции, поэтому нет возможности ограничить типы аргументов функцией.

Тип подсказки полезен для документации или кодовых линт, но python не использует эту информацию для обеспечения чего-либо во время выполнения.

Если вы действительно хотите обеспечить справедливость интерфейса (даже за пределами только типов аргументов), способ сделать это будет с функциональными unittests.

Unittesting and Test-Driven Development настолько распространены в сообществе python, что тип-подсказка на самом деле не очень много добавляет, когда дело доходит до тестирования и поиска ошибок. И хотя это спорный момент, есть много людей, которые считают, что любая польза от подсказки типа немедленно уничтожается, делая код Python более трудным для чтения. Есть несколько перспективных возможностей с типом намека на возможность компиляции python на C или Java, но их пока нет.

+0

Не утилита mypy не компилирует его и не проверяет наличие проблем до выполнения? Или я не понимаю его – Andrew

+1

mypy может протестировать закрытую систему. Он может проверить, что внутри вашего кода вы не вызываете функцию с неправильными типами данных. Если вы пишете пакет python, который будут использовать другие, он, очевидно, не сможет проверить это, поэтому он по-прежнему не применяет никаких типов. Если вы определяете подсказки типа в своем коде, это означает, что другие, использующие вашу библиотеку, могут запускать mypy по своему собственному коду и, возможно, получать предупреждения о некоторых типах. –

+0

Я не думаю, что OP просит что-либо сделать во время выполнения; он говорит: «Я могу бросить во время выполнения, если захочу», но кажется, что это легко. Кажется, он хочет * статического * проверки времени. И PEP 484/mypy обеспечивают именно это: если вы определяете класс, который должен был набирать абстрактные методы, подклассы не передавали бы проверку типа, если они имеют неправильные аргументы. – max

 Смежные вопросы

  • Нет связанных вопросов^_^