I am trying to access issue comments using PyGithub library.
this is the function which I implemented,
def get_issue_comments_dict(self, repository):
"""
get issue comments
outputs reponame: issue title, issue url, comments
Return type: dict
"""
repo = self.user_obj.get_repo(repository)
issues = repo.get_issues()
issues_dict = {}
i = 1
for issue in issues:
issue_dict = {}
issue_dict['url'] = issue.url
issue_dict['title'] = issue.title
issue_dict['comments'] = [comment for comment in
issue.get_issue_comments()]
issues_dict[i] = issue_dict
i += 1
return issues_dict
and this is the error which I face.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "GithubWrapper.py", line 164, in get_issue_comments_dict
issue.get_issue_comments()]
AttributeError: 'Issue' object has no attribute 'get_issue_comments'
What am I doing wrong here?
Okay, first of all, a Minimal Reproducible Example for your question is:
import github
gh = github.Github()
repo = gh.get_repo('PyGithub/PyGithub')
for issue in repo.get_issues():
comments = issue.get_issue_comments()
which results in:
AttributeError: 'Issue' object has no attribute 'get_issue_comments'
Python is literally telling you that the Issue
object does not have a method (or any attribute, for that matter) called get_issue_comments
. Apparently you're calling the wrong method.
So how can you know which methods are available? I agree the documentation is (at the time of writing) quite limited. You have a number of other options:
Using help()
For any Python object (module, class, method, ...) that has a proper docstring, the built-in help()
function is really very helpful ;-)
issue = repo.get_issues()[0]
help(issue)
This will print:
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`
|
...
As you can see, the class is well documented and apparently it contains a method 'get_comments', which you can use.
Using dir()
You can also see which attributes (such as methods) an object contains, using the built-in function dir()
:
issue = repo.get_issues()[0]
print(dir(issue)) # in an interactive shell you don't have to print()
This will 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']
Here you will also see that it does not include a name 'get_issue_comments', but that it does contain a name 'get_comments'.
Change the following line:
issue_dict['comments'] = [comment for comment in issue.get_issue_comments()]
to:
issue_dict['comments'] = [comment for comment in issue.get_comments()]