Title: Improve duck type compatibility of int with float · Issue #100268 · python/cpython · GitHub
Open Graph Title: Improve duck type compatibility of int with float · Issue #100268 · python/cpython
X Title: Improve duck type compatibility of int with float · Issue #100268 · python/cpython
Description: Feature or enhancement Function arguments and variables annotated with float should not allow value of type int. Pitch PEP484 suggested that when an argument is annotated as having type float, an argument of type int is acceptable;. This...
Open Graph Description: Feature or enhancement Function arguments and variables annotated with float should not allow value of type int. Pitch PEP484 suggested that when an argument is annotated as having type float, an a...
X Description: Feature or enhancement Function arguments and variables annotated with float should not allow value of type int. Pitch PEP484 suggested that when an argument is annotated as having type float, an a...
Opengraph URL: https://github.com/python/cpython/issues/100268
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Improve duck type compatibility of int with float","articleBody":"# Feature or enhancement\r\n\r\nFunction arguments and variables annotated with `float` should not allow value of type `int.`\r\n\r\n# Pitch\r\n\r\n[PEP484](https://peps.python.org/pep-0484/) suggested that `when an argument is annotated as having type float, an argument of type int is acceptable;`. This allows this kind of typing to be valid:\r\n\r\n`x: float = 2`\r\n\r\nBut `int` is not subtype of `float` and doesn't provide the same interface. Float provides methods that are not available in `int`:\r\n\r\n- `is_integer`\r\n- `fromhex`\r\n- `hex`\r\n\r\nThis violates LSP and is problematic especially with `is_integer`:\r\n\r\n```python\r\ndef method_requiring_whole_number_float(number: float):\r\n if number.is_integer():\r\n ...\r\n```\r\n\r\nThis method clearly states that it requires `float` and as an author of such code, I would expect that `is_integer` would be available if my typing is correct.\r\n\r\nThere are workarounds (`if int(number) == number:`) but they render the `is_integer` useless as it can never be safely used.\r\n\r\nJust adding the missing methods to `int` (or removing the extra methods from `float`) would not be valid solution as there are other problems stemming from the fact that `int` is not `float`. Eg.:\r\n\r\n```python\r\ndef split_whole_and_decimal(number: float) -\u003e tuple[str, str]:\r\n return str(number).split('.') # it's reasonable to expect that the output contains a dot `.` as `float` does but `int` doesn't \r\n```\r\n\r\nI'm proposing an errata to PEP484 that will remove `when an argument is annotated as having type float, an argument of type int is acceptable;`.\n\n\u003c!-- gh-linked-prs --\u003e\n### Linked PRs\n* gh-100439\n\u003c!-- /gh-linked-prs --\u003e\n","author":{"url":"https://github.com/JakubTesarek","@type":"Person","name":"JakubTesarek"},"datePublished":"2022-12-15T14:17:07.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":12},"url":"https://github.com/100268/cpython/issues/100268"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:394c22e6-afd3-2ed1-0fe4-d857e99f5d2b |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | E690:4D9DF:2301713:3164712:69691AA7 |
| html-safe-nonce | e97f53f257f19fdac9cd8ce4938a23e744b0b8a8c6a447552040a9213645b60c |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFNjkwOjREOURGOjIzMDE3MTM6MzE2NDcxMjo2OTY5MUFBNyIsInZpc2l0b3JfaWQiOiI0NzQwNDU4MTc2MzQxMTU0NDcxIiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0= |
| visitor-hmac | b594c4de445442fe22510830ecfef9ed4a00dfc4116a6b379fe0da68fce7b881 |
| hovercard-subject-tag | issue:1498520249 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/100268/issue_layout |
| twitter:image | https://opengraph.githubassets.com/6269845910eef895008327be6d6b84da9818a2ca927b51e09a60d4340eaa9048/python/cpython/issues/100268 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/6269845910eef895008327be6d6b84da9818a2ca927b51e09a60d4340eaa9048/python/cpython/issues/100268 |
| og:image:alt | Feature or enhancement Function arguments and variables annotated with float should not allow value of type int. Pitch PEP484 suggested that when an argument is annotated as having type float, an a... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | JakubTesarek |
| hostname | github.com |
| expected-hostname | github.com |
| None | 0e60568924309a021b51adabdce15c2a2f285b556f3130d1a2fa2a5bce11c55f |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | dd206f7ed6207863172be4a783826e86bd2375c3 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width