好的,首先,针对您的问题的最小可重复性示例是:
import github
gh = github.Github()
repo = gh.get_repo('PyGithub/PyGithub')
for issue in repo.get_issues():
comments = issue.get_issue_comments()
这导致:
AttributeError: 'Issue' object has no attribute 'get_issue_comments'
如何解决这个问题?
Python 从字面上告诉您,该Issue
对象没有名为get_issue_comments
. 显然你调用了错误的方法。
那么你怎么知道有哪些方法可用呢?我同意文档(在撰写本文时)非常有限。您还有许多其他选择:
使用帮助()
对于任何具有适当文档字符串的 Python 对象(模块、类、方法...),内置help()
函数确实非常有用 ;-)
issue = repo.get_issues()[0]
help(issue)
这将打印:
Help on Issue in module github.Issue object:
class Issue(github.GithubObject.CompletableGithubObject)
| Issue(requester, headers, attributes, completed)
|
| This class represents Issues. The reference can be found here https://developer.github.com/v3/issues/
|
| Method resolution order:
| Issue
| github.GithubObject.CompletableGithubObject
| github.GithubObject.GithubObject
| builtins.object
|
| Methods defined here:
|
| __repr__(self)
| Return repr(self).
|
...
|
| get_comments(self, since=NotSet)
| :calls: `GET /repos/:owner/:repo/issues/:number/comments <http://developer.github.com/v3/issues/comments>`_
| :param since: datetime.datetime format YYYY-MM-DDTHH:MM:SSZ
| :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.IssueComment.IssueComment`
|
...
如您所见,该类有很好的文档记录,显然它包含一个您可以使用的方法“get_comments”。
使用 dir()
您还可以使用内置函数查看对象包含哪些属性(例如方法)dir()
:
issue = repo.get_issues()[0]
print(dir(issue)) # in an interactive shell you don't have to print()
这将打印:
['CHECK_AFTER_INIT_FLAG', '_CompletableGithubObject__complete', '_CompletableGithubObject__completed', '_GithubObject__makeSimpleAttribute', '_GithubObject__makeSimpleListAttribute', '_GithubObject__makeTransformedAttribute', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_assignee', '_assignees', '_body', '_closed_at', '_closed_by', '_comments', '_comments_url', '_completeIfNeeded', '_completeIfNotSet', '_created_at', '_events_url', '_headers', '_html_url', '_id', '_identity', '_initAttributes', '_labels', '_labels_url', '_locked', '_makeBoolAttribute', '_makeClassAttribute', '_makeDatetimeAttribute', '_makeDictAttribute', '_makeDictOfStringsToClassesAttribute', '_makeIntAttribute', '_makeListOfClassesAttribute', '_makeListOfDictsAttribute', '_makeListOfIntsAttribute', '_makeListOfListOfStringsAttribute', '_makeListOfStringsAttribute', '_makeStringAttribute', '_makeTimestampAttribute', '_milestone', '_number', '_parentUrl', '_pull_request', '_rawData', '_repository', '_requester', '_state', '_storeAndUseAttributes', '_title', '_updated_at', '_url', '_useAttributes', '_user', 'active_lock_reason', 'add_to_assignees', 'add_to_labels', 'as_pull_request', 'assignee', 'assignees', 'body', 'closed_at', 'closed_by', 'comments', 'comments_url', 'create_comment', 'create_reaction', 'created_at', 'delete_labels', 'edit', 'etag', 'events_url', 'get__repr__', 'get_comment', 'get_comments', 'get_events', 'get_labels', 'get_reactions', 'html_url', 'id', 'labels', 'labels_url', 'last_modified', 'lock', 'locked', 'milestone', 'number', 'pull_request', 'raw_data', 'raw_headers', 'remove_from_assignees', 'remove_from_labels', 'repository', 'setCheckAfterInitFlag', 'set_labels', 'state', 'title', 'unlock', 'update', 'updated_at', 'url', 'user']
在这里,您还将看到它不包含名称“get_issue_comments”,但确实包含名称“get_comments”。
解决方案
更改以下行:
issue_dict['comments'] = [comment for comment in issue.get_issue_comments()]
到:
issue_dict['comments'] = [comment for comment in issue.get_comments()]