{"action":"created","comment":{"url":"https://api.github.com/repos/python/mypy/pulls/comments/91597408","pull_request_review_id":12107639,"id":91597408,"diff_hunk":"@@ -0,0 +1,280 @@\n+.. _cheat-sheet-py3:\n+\n+Mypy syntax cheat sheet (Python 3)\n+==================================\n+\n+This document is a quick cheat sheet showing how the `PEP 484 <https://www.python.org/dev/peps/pep-0484/>`_ type\n+language represents various common types in Python 3. Up to the last section, the syntax is valid on all versions of Python 3. See the last section for more on variable annotation syntax.\n+\n+.. note::\n+\n+   Technically many of the type annotations shown below are redundant,\n+   because mypy can derive them from the type of the expression.  So\n+   many of the examples have a dual purpose: show how to write the\n+   annotation, and show the inferred types.\n+\n+\n+Built-in types\n+**************\n+\n+.. code-block:: python\n+\n+   from typing import List, Set, Dict, Tuple, Text, Optional, AnyStr\n+\n+   # For simple built-in types, just use the name of the type.\n+   x = 1 # type: int\n+   x = 1.0 # type: float\n+   x = True # type: bool\n+   x = \"test\" # type: str\n+   x = u\"test\" # type: unicode\n+\n+   # For collections, the name of the type is capitalized, and the\n+   # name of the type inside the collection is in brackets.\n+   x = [1] # type: List[int]\n+   x = set([6, 7]) # type: Set[int]\n+\n+   # For mappings, we need the types of both keys and values.\n+   x = dict(field=2.0) # type: Dict[str, float]\n+\n+   # For tuples, we specify the types of all the elements.\n+   x = (3, \"yes\", 7.5) # type: Tuple[int, str, float]\n+\n+   # For textual data, use Text.\n+   # This is `unicode` in Python 2 and `str` in Python 3.\n+   x = [\"string\", u\"unicode\"] # type: List[Text]\n+\n+\n+\n+   # Use Optional for values that could be None.\n+   input_str = f() # type: Optional[str]\n+   if input_str is not None:\n+      print(input_str)\n+\n+\n+Functions\n+*********\n+\n+Python 3 introduces an annotation syntax for function declarations in `PEP 3107 <https://www.python.org/dev/peps/pep-3107/>`_.\n+\n+.. code-block:: python\n+\n+   from typing import Callable, Iterable, Union, Optional, List\n+\n+   # This is how you annotate a function definition.\n+   def stringify(num: int) -> str:\n+       return str(num)\n+       \n+   # And here's how you specify multiple arguments.\n+   def plus(num1: int, num2: int) -> int:\n+       return num1 + num2\n+\n+   # Add type annotations for kwargs as though they were positional args.\n+   def f(num1: int, my_float: float = 3.5) -> float:\n+       return num1 + my_float\n+\n+   # This is how you annotate a function value.\n+   x = f # type: Callable[[int, float], float]\n+\n+   # A generator function that yields ints is secretly just a function that\n+   # returns an iterable (see below) of ints, so that's how we annotate it.\n+   def f(n: int) -> Iterable[int]:\n+       i = 0\n+       while i < n:\n+           yield i\n+           i += 1\n+\n+   # For a function with many arguments, you can of course split it over multiple lines\n+   def send_email(address: Union[str, List[str]],\n+                  sender: str,\n+                  cc: Optional[List[str]],\n+                  bcc: Optional[List[str]],\n+                  subject='',\n+                  body: List[str] = None\n+                  ) -> bool:\n+       \n+       pass\n+\n+\n+When you're puzzled or when things are complicated\n+**************************************************\n+\n+.. code-block:: python\n+\n+   from typing import Union, Any, List, cast\n+\n+   # To find out what type mypy infers for an expression anywhere in\n+   # your program, wrap it in reveal_type.  Mypy will print an error\n+   # message with the type; remove it again before running the code.\n+   reveal_type(1) # -> error: Revealed type is 'builtins.int'\n+\n+   # Use Union when something could be one of a few types.\n+   x = [3, 5, \"test\", \"fun\"] # type: List[Union[int, str]]\n+\n+   # Use Any if you don't know the type of something or it's too\n+   # dynamic to write a type for.\n+   x = mystery_function() # type: Any\n+\n+   # Use `ignore` to suppress type-checking on a given line, when your\n+   # code confuses mypy or runs into an outright bug in mypy.\n+   # Good practice is to comment every `ignore` with a bug link\n+   # (in mypy, typeshed, or your own code) or an explanation of the issue.\n+   x = confusing_function() # type: ignore # https://github.com/python/mypy/issues/1167\n+\n+   # cast is a helper function for mypy that allows for guidance of how to convert types.\n+   # it does not cast at runtime\n+   a = [4]\n+   b = cast(List[int], a) # passes fine\n+   c = cast(List[str], a) # passes fine (no runtime check)\n+   reveal_type(c) # -> error: Revealed type is 'builtins.list[builtins.str]'\n+   print(c) # -> [4] the object is not cast\n+\n+   # TODO: explain \"Need type annotation for variable\" when\n+   # initializing with None or an empty container\n+\n+\n+Standard duck types\n+*******************\n+\n+In typical Python code, many functions that can take a list or a dict\n+as an argument only need their argument to be somehow \"list-like\" or\n+\"dict-like\".  A specific meaning of \"list-like\" or \"dict-like\" (or\n+something-else-like) is called a \"duck type\", and several duck types\n+that are common in idiomatic Python are standardized.\n+\n+.. code-block:: python\n+\n+   from typing import Mapping, MutableMapping, Sequence, Iterable, List, Set\n+\n+   # Use Iterable for generic iterables (anything usable in `for`),\n+   # and Sequence where a sequence (supporting `len` and `__getitem__`) is required.\n+   def f(iterable_of_ints: Iterable[int]) -> List[str]:\n+       return [str(x) for x in iterable_of_ints]\n+   f(range(1, 3))\n+\n+   # Mapping describes a dict-like object (with `__getitem__`) that we won't mutate,\n+   # and MutableMapping one (with `__setitem__`) that we might.\n+   def f(my_dict: Mapping[int, str])-> List[int]:\n+       return list(my_dict.keys())\n+   f({3: 'yes', 4: 'no'})\n+   def f(my_mapping: MutableMapping[int, str]) -> Set[str]:\n+       my_mapping[5] = 'maybe'\n+       return set(my_mapping.values())\n+   f({3: 'yes', 4: 'no'})\n+\n+\n+Classes\n+*******\n+\n+.. code-block:: python\n+\n+   class MyClass(object):\n+       # The __init__ method doesn't return anything, so it gets return\n+       # type None just like any other method that doesn't return anything.\n+       def __init__(self) -> None:\n+           pass\n+       # For instance methods, omit `self`.\n+       def my_class_method(self, num: int, str1: str) -> str:\n+           return num * str1\n+\n+\n+\n+   # User-defined classes are written with just their own names.\n+   x = MyClass() # type: MyClass\n+\n+\n+Other stuff\n+***********\n+\n+.. code-block:: python\n+\n+   import sys\n+   import re\n+   # typing.Match describes regex matches from the re module.\n+   from typing import Match, AnyStr, IO\n+   x = re.match(r'[0-9]+', \"15\") # type: Match[str]\n+\n+   # You can use AnyStr to indicate that any string type will work\n+   # but not to mix types\n+   def full_name(first: AnyStr, last: AnyStr) -> AnyStr:\n+       return first+last\n+   full_name('Jon','Doe') # same str ok\n+   full_name(b'Bill', b'Bit') # same binary ok\n+   full_name(b'Terry', 'Trouble') # different str types, fails\n+\n+   # Use IO[] for functions that should accept or return any\n+   # object that comes from an open() call. The IO[] does not\n+   # distinguish between reading, writing or other modes.\n+   def get_sys_IO(mode='w') -> IO[str]:\n+       if mode == 'w':\n+           return sys.stdout\n+       elif mode == 'r':\n+           return sys.stdin\n+       else:\n+           return sys.stdout\n+\n+   # forward references are useful if you want to referemce a class before it is designed\n+   \n+   def(foo: A) -> int: # this will fail\n+       ...\n+   \n+   class A:\n+       pass\n+       \n+   # however, using the string 'A', it will pass as long as there is a class of that name later on\n+   def(foo: 'A') -> int:\n+       ...\n+\n+   # TODO: add TypeVar and a simple generic function\n+\n+Variable Annotation in Python 3.6 with PEP 526\n+**********************************************\n+\n+Python 3.6 brings new syntax for annotating variables with `PEP 526 <https://www.python.org/dev/peps/pep-0526/>`_.\n+\n+\n+\n+.. code-block:: python\n+\n+   from typing import ClassVar\n+   # annotation is similar to arguments to functions\n+   name: str = \"Eric Idle\"\n+   \n+   # you can annotate objects in more complex expresions such as\n+   a = {}\n+   a['b']: int # the value is checked to be of type int\n+   \n+   b = Car() : Car\n+   b.doors: int = 4 # you can type annotate instance variables after class instantiation","path":"docs/source/cheat_sheet_py3.rst","position":247,"original_position":247,"commit_id":"45d6499e5883738cec406d566396305b25e7ee65","original_commit_id":"45d6499e5883738cec406d566396305b25e7ee65","user":{"login":"JukkaL","id":1107911,"avatar_url":"https://avatars.githubusercontent.com/u/1107911?v=3","gravatar_id":"","url":"https://api.github.com/users/JukkaL","html_url":"https://github.com/JukkaL","followers_url":"https://api.github.com/users/JukkaL/followers","following_url":"https://api.github.com/users/JukkaL/following{/other_user}","gists_url":"https://api.github.com/users/JukkaL/gists{/gist_id}","starred_url":"https://api.github.com/users/JukkaL/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JukkaL/subscriptions","organizations_url":"https://api.github.com/users/JukkaL/orgs","repos_url":"https://api.github.com/users/JukkaL/repos","events_url":"https://api.github.com/users/JukkaL/events{/privacy}","received_events_url":"https://api.github.com/users/JukkaL/received_events","type":"User","site_admin":false},"body":"Mypy doesn't support this. This syntax is only valid for `self.x`.","created_at":"2016-12-08T20:13:27Z","updated_at":"2016-12-08T20:13:27Z","html_url":"https://github.com/python/mypy/pull/2539#discussion_r91597408","pull_request_url":"https://api.github.com/repos/python/mypy/pulls/2539","_links":{"self":{"href":"https://api.github.com/repos/python/mypy/pulls/comments/91597408"},"html":{"href":"https://github.com/python/mypy/pull/2539#discussion_r91597408"},"pull_request":{"href":"https://api.github.com/repos/python/mypy/pulls/2539"}}},"pull_request":{"url":"https://api.github.com/repos/python/mypy/pulls/2539","id":97181350,"html_url":"https://github.com/python/mypy/pull/2539","diff_url":"https://github.com/python/mypy/pull/2539.diff","patch_url":"https://github.com/python/mypy/pull/2539.patch","issue_url":"https://api.github.com/repos/python/mypy/issues/2539","number":2539,"state":"open","locked":false,"title":"Create Python 3 cheat sheet","user":{"login":"ethanhs","id":9504279,"avatar_url":"https://avatars.githubusercontent.com/u/9504279?v=3","gravatar_id":"","url":"https://api.github.com/users/ethanhs","html_url":"https://github.com/ethanhs","followers_url":"https://api.github.com/users/ethanhs/followers","following_url":"https://api.github.com/users/ethanhs/following{/other_user}","gists_url":"https://api.github.com/users/ethanhs/gists{/gist_id}","starred_url":"https://api.github.com/users/ethanhs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethanhs/subscriptions","organizations_url":"https://api.github.com/users/ethanhs/orgs","repos_url":"https://api.github.com/users/ethanhs/repos","events_url":"https://api.github.com/users/ethanhs/events{/privacy}","received_events_url":"https://api.github.com/users/ethanhs/received_events","type":"User","site_admin":false},"body":"Based on the Python 2 cheat sheet. Updated for string differences and typos, added  cast, PEP 526 annotations, and forward references as discussed in #1661. I found a few typos/mistakes in the code that comes from the Python 2 cheat sheet, and I can add the cast section, so I expect to have a new PR for that cheat sheet in the next couple days.","created_at":"2016-12-08T19:07:40Z","updated_at":"2016-12-08T20:13:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b8407dd3b4396e49b1cb075353e88003c2f6840a","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/python/mypy/pulls/2539/commits","review_comments_url":"https://api.github.com/repos/python/mypy/pulls/2539/comments","review_comment_url":"https://api.github.com/repos/python/mypy/pulls/comments{/number}","comments_url":"https://api.github.com/repos/python/mypy/issues/2539/comments","statuses_url":"https://api.github.com/repos/python/mypy/statuses/45d6499e5883738cec406d566396305b25e7ee65","head":{"label":"ethanhs:master","ref":"master","sha":"45d6499e5883738cec406d566396305b25e7ee65","user":{"login":"ethanhs","id":9504279,"avatar_url":"https://avatars.githubusercontent.com/u/9504279?v=3","gravatar_id":"","url":"https://api.github.com/users/ethanhs","html_url":"https://github.com/ethanhs","followers_url":"https://api.github.com/users/ethanhs/followers","following_url":"https://api.github.com/users/ethanhs/following{/other_user}","gists_url":"https://api.github.com/users/ethanhs/gists{/gist_id}","starred_url":"https://api.github.com/users/ethanhs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethanhs/subscriptions","organizations_url":"https://api.github.com/users/ethanhs/orgs","repos_url":"https://api.github.com/users/ethanhs/repos","events_url":"https://api.github.com/users/ethanhs/events{/privacy}","received_events_url":"https://api.github.com/users/ethanhs/received_events","type":"User","site_admin":false},"repo":{"id":75895683,"name":"mypy","full_name":"ethanhs/mypy","owner":{"login":"ethanhs","id":9504279,"avatar_url":"https://avatars.githubusercontent.com/u/9504279?v=3","gravatar_id":"","url":"https://api.github.com/users/ethanhs","html_url":"https://github.com/ethanhs","followers_url":"https://api.github.com/users/ethanhs/followers","following_url":"https://api.github.com/users/ethanhs/following{/other_user}","gists_url":"https://api.github.com/users/ethanhs/gists{/gist_id}","starred_url":"https://api.github.com/users/ethanhs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ethanhs/subscriptions","organizations_url":"https://api.github.com/users/ethanhs/orgs","repos_url":"https://api.github.com/users/ethanhs/repos","events_url":"https://api.github.com/users/ethanhs/events{/privacy}","received_events_url":"https://api.github.com/users/ethanhs/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ethanhs/mypy","description":"Optional static typing for Python 2 and 3 (PEP484)","fork":true,"url":"https://api.github.com/repos/ethanhs/mypy","forks_url":"https://api.github.com/repos/ethanhs/mypy/forks","keys_url":"https://api.github.com/repos/ethanhs/mypy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ethanhs/mypy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ethanhs/mypy/teams","hooks_url":"https://api.github.com/repos/ethanhs/mypy/hooks","issue_events_url":"https://api.github.com/repos/ethanhs/mypy/issues/events{/number}","events_url":"https://api.github.com/repos/ethanhs/mypy/events","assignees_url":"https://api.github.com/repos/ethanhs/mypy/assignees{/user}","branches_url":"https://api.github.com/repos/ethanhs/mypy/branches{/branch}","tags_url":"https://api.github.com/repos/ethanhs/mypy/tags","blobs_url":"https://api.github.com/repos/ethanhs/mypy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ethanhs/mypy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ethanhs/mypy/git/refs{/sha}","trees_url":"https://api.github.com/repos/ethanhs/mypy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ethanhs/mypy/statuses/{sha}","languages_url":"https://api.github.com/repos/ethanhs/mypy/languages","stargazers_url":"https://api.github.com/repos/ethanhs/mypy/stargazers","contributors_url":"https://api.github.com/repos/ethanhs/mypy/contributors","subscribers_url":"https://api.github.com/repos/ethanhs/mypy/subscribers","subscription_url":"https://api.github.com/repos/ethanhs/mypy/subscription","commits_url":"https://api.github.com/repos/ethanhs/mypy/commits{/sha}","git_commits_url":"https://api.github.com/repos/ethanhs/mypy/git/commits{/sha}","comments_url":"https://api.github.com/repos/ethanhs/mypy/comments{/number}","issue_comment_url":"https://api.github.com/repos/ethanhs/mypy/issues/comments{/number}","contents_url":"https://api.github.com/repos/ethanhs/mypy/contents/{+path}","compare_url":"https://api.github.com/repos/ethanhs/mypy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ethanhs/mypy/merges","archive_url":"https://api.github.com/repos/ethanhs/mypy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ethanhs/mypy/downloads","issues_url":"https://api.github.com/repos/ethanhs/mypy/issues{/number}","pulls_url":"https://api.github.com/repos/ethanhs/mypy/pulls{/number}","milestones_url":"https://api.github.com/repos/ethanhs/mypy/milestones{/number}","notifications_url":"https://api.github.com/repos/ethanhs/mypy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ethanhs/mypy/labels{/name}","releases_url":"https://api.github.com/repos/ethanhs/mypy/releases{/id}","deployments_url":"https://api.github.com/repos/ethanhs/mypy/deployments","created_at":"2016-12-08T02:37:41Z","updated_at":"2016-12-08T02:37:44Z","pushed_at":"2016-12-08T19:02:09Z","git_url":"git://github.com/ethanhs/mypy.git","ssh_url":"git@github.com:ethanhs/mypy.git","clone_url":"https://github.com/ethanhs/mypy.git","svn_url":"https://github.com/ethanhs/mypy","homepage":"http://www.mypy-lang.org/","size":16689,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"python:master","ref":"master","sha":"5f663502f4248a352ae9b4f0e93de5cce9c3e38e","user":{"login":"python","id":1525981,"avatar_url":"https://avatars.githubusercontent.com/u/1525981?v=3","gravatar_id":"","url":"https://api.github.com/users/python","html_url":"https://github.com/python","followers_url":"https://api.github.com/users/python/followers","following_url":"https://api.github.com/users/python/following{/other_user}","gists_url":"https://api.github.com/users/python/gists{/gist_id}","starred_url":"https://api.github.com/users/python/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/python/subscriptions","organizations_url":"https://api.github.com/users/python/orgs","repos_url":"https://api.github.com/users/python/repos","events_url":"https://api.github.com/users/python/events{/privacy}","received_events_url":"https://api.github.com/users/python/received_events","type":"Organization","site_admin":false},"repo":{"id":7053637,"name":"mypy","full_name":"python/mypy","owner":{"login":"python","id":1525981,"avatar_url":"https://avatars.githubusercontent.com/u/1525981?v=3","gravatar_id":"","url":"https://api.github.com/users/python","html_url":"https://github.com/python","followers_url":"https://api.github.com/users/python/followers","following_url":"https://api.github.com/users/python/following{/other_user}","gists_url":"https://api.github.com/users/python/gists{/gist_id}","starred_url":"https://api.github.com/users/python/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/python/subscriptions","organizations_url":"https://api.github.com/users/python/orgs","repos_url":"https://api.github.com/users/python/repos","events_url":"https://api.github.com/users/python/events{/privacy}","received_events_url":"https://api.github.com/users/python/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/python/mypy","description":"Optional static typing for Python 2 and 3 (PEP484)","fork":false,"url":"https://api.github.com/repos/python/mypy","forks_url":"https://api.github.com/repos/python/mypy/forks","keys_url":"https://api.github.com/repos/python/mypy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/python/mypy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/python/mypy/teams","hooks_url":"https://api.github.com/repos/python/mypy/hooks","issue_events_url":"https://api.github.com/repos/python/mypy/issues/events{/number}","events_url":"https://api.github.com/repos/python/mypy/events","assignees_url":"https://api.github.com/repos/python/mypy/assignees{/user}","branches_url":"https://api.github.com/repos/python/mypy/branches{/branch}","tags_url":"https://api.github.com/repos/python/mypy/tags","blobs_url":"https://api.github.com/repos/python/mypy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/python/mypy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/python/mypy/git/refs{/sha}","trees_url":"https://api.github.com/repos/python/mypy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/python/mypy/statuses/{sha}","languages_url":"https://api.github.com/repos/python/mypy/languages","stargazers_url":"https://api.github.com/repos/python/mypy/stargazers","contributors_url":"https://api.github.com/repos/python/mypy/contributors","subscribers_url":"https://api.github.com/repos/python/mypy/subscribers","subscription_url":"https://api.github.com/repos/python/mypy/subscription","commits_url":"https://api.github.com/repos/python/mypy/commits{/sha}","git_commits_url":"https://api.github.com/repos/python/mypy/git/commits{/sha}","comments_url":"https://api.github.com/repos/python/mypy/comments{/number}","issue_comment_url":"https://api.github.com/repos/python/mypy/issues/comments{/number}","contents_url":"https://api.github.com/repos/python/mypy/contents/{+path}","compare_url":"https://api.github.com/repos/python/mypy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/python/mypy/merges","archive_url":"https://api.github.com/repos/python/mypy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/python/mypy/downloads","issues_url":"https://api.github.com/repos/python/mypy/issues{/number}","pulls_url":"https://api.github.com/repos/python/mypy/pulls{/number}","milestones_url":"https://api.github.com/repos/python/mypy/milestones{/number}","notifications_url":"https://api.github.com/repos/python/mypy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/python/mypy/labels{/name}","releases_url":"https://api.github.com/repos/python/mypy/releases{/id}","deployments_url":"https://api.github.com/repos/python/mypy/deployments","created_at":"2012-12-07T13:30:23Z","updated_at":"2016-12-08T19:25:50Z","pushed_at":"2016-12-08T19:07:40Z","git_url":"git://github.com/python/mypy.git","ssh_url":"git@github.com:python/mypy.git","clone_url":"https://github.com/python/mypy.git","svn_url":"https://github.com/python/mypy","homepage":"http://www.mypy-lang.org/","size":20352,"stargazers_count":2025,"watchers_count":2025,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":237,"mirror_url":null,"open_issues_count":541,"forks":237,"open_issues":541,"watchers":2025,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/python/mypy/pulls/2539"},"html":{"href":"https://github.com/python/mypy/pull/2539"},"issue":{"href":"https://api.github.com/repos/python/mypy/issues/2539"},"comments":{"href":"https://api.github.com/repos/python/mypy/issues/2539/comments"},"review_comments":{"href":"https://api.github.com/repos/python/mypy/pulls/2539/comments"},"review_comment":{"href":"https://api.github.com/repos/python/mypy/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/python/mypy/pulls/2539/commits"},"statuses":{"href":"https://api.github.com/repos/python/mypy/statuses/45d6499e5883738cec406d566396305b25e7ee65"}}}}
{"actor":{"display_login":"JukkaL"}}