A docstring is a string literal that occurs as the first statement in
a module, function, class, or method definition. Such a docstring
becomes the __doc__
special attribute of that object.
This is specially useful, for instance, when you are introspecting code and you want to know what a specific method or function does.
pep257 is a Python docstring style checker.
I already filled a feature request on plone.recipe.codeanalysis to add support for it; meanwhile, if you want to use it in your Buildout-based projects, you can add the following to your buildout configuration:
After running
bin/buildout
you will find a bin/pep257
script.A typical output will look like this:
(python-2.7)# hvelarde@nanovac (master * u+1) ~/collective/polls # bin/pep257 src/ src/collective/__init__.py:1 at module level: D100: Docstring missing src/collective/polls/js_i18n_helper.py:1 at module level: D100: Docstring missing src/collective/polls/js_i18n_helper.py:8 in public class `LegendOthersTranslation`: D101: Docstring missing src/collective/polls/js_i18n_helper.py:14 in public method `render`: D102: Docstring missing src/collective/polls/testing.py:1 at module level: D100: Docstring missing src/collective/polls/testing.py:10 in public class `Fixture`: D101: Docstring missing src/collective/polls/testing.py:14 in public method `setUpZope`: D102: Docstring missing src/collective/polls/testing.py:19 in public method `setUpPloneSite`: D102: Docstring missing src/collective/polls/config.py:1 at module level: D100: Docstring missing src/collective/polls/polls.py:1 at module level: D100: Docstring missing src/collective/polls/polls.py:21 in public class `IPolls`: D101: Docstring missing src/collective/polls/polls.py:24 in public method `recent_polls`: D400: First line should end with '.', not 's' src/collective/polls/polls.py:24 in public method `recent_polls`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:27 in public method `uid_for_poll`: D400: First line should end with '.', not 'l' src/collective/polls/polls.py:27 in public method `uid_for_poll`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:30 in public method `poll_by_uid`: D400: First line should end with '.', not 'd' src/collective/polls/polls.py:30 in public method `poll_by_uid`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:33 in public method `voters_in_a_poll`: D400: First line should end with '.', not 'l' src/collective/polls/polls.py:33 in public method `voters_in_a_poll`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:36 in public method `voted_in_a_poll`: D400: First line should end with '.', not 'd' src/collective/polls/polls.py:36 in public method `voted_in_a_poll`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:39 in public method `allowed_to_edit`: D401: First line should be imperative: 'i', not 'is' src/collective/polls/polls.py:39 in public method `allowed_to_edit`: D400: First line should end with '.', not 'l' src/collective/polls/polls.py:39 in public method `allowed_to_edit`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:42 in public method `allowed_to_view`: D401: First line should be imperative: 'I', not 'Is' src/collective/polls/polls.py:42 in public method `allowed_to_view`: D400: First line should end with '.', not 'l' src/collective/polls/polls.py:42 in public method `allowed_to_view`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:45 in public method `allowed_to_vote`: D400: First line should end with '.', not 'l' src/collective/polls/polls.py:45 in public method `allowed_to_vote`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:48 in public method `anonymous_vote_id`: D400: First line should end with '.', not 'd' src/collective/polls/polls.py:48 in public method `anonymous_vote_id`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:52 in public class `Polls`: D203: Expected 1 blank line *before* class docstring, found 0 src/collective/polls/polls.py:52 in public class `Polls`: D400: First line should end with '.', not 's' src/collective/polls/polls.py:52 in public class `Polls`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:60 in public method `ct`: D102: Docstring missing src/collective/polls/polls.py:64 in public method `mt`: D102: Docstring missing src/collective/polls/polls.py:68 in public method `wt`: D102: Docstring missing src/collective/polls/polls.py:72 in public method `member`: D102: Docstring missing src/collective/polls/polls.py:75 in private method `_query_for_polls`: D400: First line should end with '.', not 's' src/collective/polls/polls.py:75 in private method `_query_for_polls`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:81 in public method `uid_for_poll`: D400: First line should end with '.', not 'l' src/collective/polls/polls.py:81 in public method `uid_for_poll`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:85 in public method `recent_polls`: D400: First line should end with '.', not 's' src/collective/polls/polls.py:85 in public method `recent_polls`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:98 in public method `poll_by_uid`: D400: First line should end with '.', not 'd' src/collective/polls/polls.py:98 in public method `poll_by_uid`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:109 in public method `voted_in_a_poll`: D400: First line should end with '.', not 'd' src/collective/polls/polls.py:109 in public method `voted_in_a_poll`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:128 in public method `allowed_to_edit`: D401: First line should be imperative: 'I', not 'Is' src/collective/polls/polls.py:128 in public method `allowed_to_edit`: D400: First line should end with '.', not 'l' src/collective/polls/polls.py:128 in public method `allowed_to_edit`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:133 in public method `allowed_to_view`: D401: First line should be imperative: 'I', not 'Is' src/collective/polls/polls.py:133 in public method `allowed_to_view`: D400: First line should end with '.', not 'l' src/collective/polls/polls.py:133 in public method `allowed_to_view`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:137 in public method `allowed_to_vote`: D401: First line should be imperative: 'i', not 'is' src/collective/polls/polls.py:137 in public method `allowed_to_vote`: D400: First line should end with '.', not '?' src/collective/polls/polls.py:137 in public method `allowed_to_vote`: D300: Expected """-quotes, got '''-quotes src/collective/polls/polls.py:156 in public class `PollPortletRender`: D203: Expected 1 blank line *before* class docstring, found 0 src/collective/polls/polls.py:156 in public class `PollPortletRender`: D204: Expected 1 blank line *after* class docstring, found 0 src/collective/polls/polls.py:156 in public class `PollPortletRender`: D400: First line should end with '.', not 'w' src/collective/polls/polls.py:181 in public method `render_portlet`: D202: No blank lines allowed *after* method docstring, found 1 src/collective/polls/polls.py:251 in public method `render`: D400: First line should end with '.', not 'e' src/collective/polls/__init__.py:1 at module level: D100: Docstring missing src/collective/polls/subscribers.py:1 at module level: D100: Docstring missing src/collective/polls/subscribers.py:17 in public function `fix_permissions`: D401: First line should be imperative: 'Thi', not 'This' src/collective/polls/subscribers.py:17 in public function `fix_permissions`: D400: First line should end with '.', not 'f' src/collective/polls/subscribers.py:17 in public function `fix_permissions`: D205: Blank line missing between one-line summary and description src/collective/polls/subscribers.py:17 in public function `fix_permissions`: D208: Docstring is over-indented src/collective/polls/subscribers.py:17 in public function `fix_permissions`: D300: Expected """-quotes, got '''-quotes src/collective/polls/subscribers.py:37 in public function `remove_votes`: D401: First line should be imperative: 'Thi', not 'This' src/collective/polls/subscribers.py:37 in public function `remove_votes`: D400: First line should end with '.', not 't' src/collective/polls/subscribers.py:37 in public function `remove_votes`: D205: Blank line missing between one-line summary and description src/collective/polls/subscribers.py:37 in public function `remove_votes`: D208: Docstring is over-indented src/collective/polls/subscribers.py:37 in public function `remove_votes`: D300: Expected """-quotes, got '''-quotes src/collective/polls/setuphandlers.py:1 at module level: D100: Docstring missing src/collective/polls/setuphandlers.py:12 in public class `HiddenProfiles`: D101: Docstring missing src/collective/polls/setuphandlers.py:18 in public method `getNonInstallableProfiles`: D102: Docstring missing src/collective/polls/setuphandlers.py:23 in public function `updateWorkflowDefinitions`: D103: Docstring missing src/collective/polls/setuphandlers.py:29 in public function `setupVarious`: D103: Docstring missing src/collective/polls/portlet/voteportlet.py:1 at module level: D100: Docstring missing src/collective/polls/portlet/voteportlet.py:24 in public function `PossiblePolls`: D103: Docstring missing src/collective/polls/portlet/voteportlet.py:46 in public class `IVotePortlet`: D203: Expected 1 blank line *before* class docstring, found 0 src/collective/polls/portlet/voteportlet.py:46 in public class `IVotePortlet`: D400: First line should end with '.', not 't' src/collective/polls/portlet/voteportlet.py:46 in public class `IVotePortlet`: D205: Blank line missing between one-line summary and description src/collective/polls/portlet/voteportlet.py:87 in public class `Assignment`: D203: Expected 1 blank line *before* class docstring, found 0 src/collective/polls/portlet/voteportlet.py:102 in public method `__init__`: D102: Docstring missing src/collective/polls/portlet/voteportlet.py:111 in public method `title`: D401: First line should be imperative: 'Thi', not 'This' src/collective/polls/portlet/voteportlet.py:111 in public method `title`: D400: First line should end with '.', not 'e' src/collective/polls/portlet/voteportlet.py:111 in public method `title`: D205: Blank line missing between one-line summary and description src/collective/polls/portlet/voteportlet.py:118 in public class `Renderer`: D203: Expected 1 blank line *before* class docstring, found 0 src/collective/polls/portlet/voteportlet.py:129 in public method `utility`: D200: One-line docstring should not occupy 2 lines src/collective/polls/portlet/voteportlet.py:135 in public method `portlet_manager_name`: D102: Docstring missing src/collective/polls/portlet/voteportlet.py:149 in public method `poll`: D102: Docstring missing src/collective/polls/portlet/voteportlet.py:170 in public method `poll_uid`: D200: One-line docstring should not occupy 2 lines src/collective/polls/portlet/voteportlet.py:176 in public method `getVotingResults`: D102: Docstring missing src/collective/polls/portlet/voteportlet.py:184 in public method `can_vote`: D102: Docstring missing src/collective/polls/portlet/voteportlet.py:193 in public method `available`: D102: Docstring missing src/collective/polls/portlet/voteportlet.py:202 in public method `is_closed`: D102: Docstring missing src/collective/polls/portlet/voteportlet.py:208 in public class `AddForm`: D203: Expected 1 blank line *before* class docstring, found 0 src/collective/polls/portlet/voteportlet.py:208 in public class `AddForm`: D204: Expected 1 blank line *after* class docstring, found 0 src/collective/polls/portlet/voteportlet.py:217 in public method `create`: D102: Docstring missing src/collective/polls/portlet/voteportlet.py:221 in public class `EditForm`: D203: Expected 1 blank line *before* class docstring, found 0 src/collective/polls/portlet/voteportlet.py:221 in public class `EditForm`: D204: Expected 1 blank line *after* class docstring, found 0 src/collective/polls/portlet/__init__.py:1 at module level: D100: Docstring missing src/collective/polls/Extensions/Install.py:1 at module level: D100: Docstring missing src/collective/polls/Extensions/Install.py:7 in public function `uninstall`: D103: Docstring missing src/collective/polls/Extensions/__init__.py:1 at module level: D100: Docstring missing src/collective/polls/tests/__init__.py:1 at module level: D100: Docstring missing src/collective/polls/content/__init__.py:1 at module level: D100: Docstring missing src/collective/polls/content/poll.py:1 at module level: D100: Docstring missing src/collective/polls/content/poll.py:34 in public class `InsuficientOptions`: D101: Docstring missing src/collective/polls/content/poll.py:38 in public class `IPoll`: D203: Expected 1 blank line *before* class docstring, found 0 src/collective/polls/content/poll.py:38 in public class `IPoll`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:80 in public method `validate_options`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:90 in public class `Poll`: D203: Expected 1 blank line *before* class docstring, found 0 src/collective/polls/content/poll.py:90 in public class `Poll`: D400: First line should end with '.', not 'e' src/collective/polls/content/poll.py:90 in public class `Poll`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:101 in public method `annotations`: D102: Docstring missing src/collective/polls/content/poll.py:105 in public method `utility`: D102: Docstring missing src/collective/polls/content/poll.py:109 in public method `getOptions`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:115 in private method `_getVotes`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:133 in public method `getResults`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:144 in private method `_validateVote`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:155 in private method `_setVoter`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:180 in public method `voters`: D102: Docstring missing src/collective/polls/content/poll.py:186 in public method `total_votes`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:192 in public method `setVote`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:217 in public class `PollAddForm`: D203: Expected 1 blank line *before* class docstring, found 0 src/collective/polls/content/poll.py:217 in public class `PollAddForm`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:223 in public method `create`: D102: Docstring missing src/collective/polls/content/poll.py:235 in public class `PollEditForm`: D203: Expected 1 blank line *before* class docstring, found 0 src/collective/polls/content/poll.py:235 in public class `PollEditForm`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:241 in public method `updateWidgets`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:258 in public method `applyChanges`: D102: Docstring missing src/collective/polls/content/poll.py:270 in public class `View`: D101: Docstring missing src/collective/polls/content/poll.py:277 in public method `update`: D102: Docstring missing src/collective/polls/content/poll.py:346 in public method `can_vote`: D102: Docstring missing src/collective/polls/content/poll.py:357 in public method `can_edit`: D102: Docstring missing src/collective/polls/content/poll.py:362 in public method `has_voted`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:371 in public method `poll_uid`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:377 in public method `getOptions`: D200: One-line docstring should not occupy 2 lines src/collective/polls/content/poll.py:382 in public method `getResults`: D200: One-line docstring should not occupy 2 lines