[issue38629] float is missing __ceil__() and __floor__(), required by numbers.Real

2019-12-15 Thread STINNER Victor

STINNER Victor  added the comment:


New changeset cb8b946ac10386e6cab1376945f64f683b5b16d3 by Victor Stinner 
(Batuhan Taşkaya) in branch 'master':
bpo-38629: implement __floor__ and __ceil__ for float type (GH-16985)
https://github.com/python/cpython/commit/cb8b946ac10386e6cab1376945f64f683b5b16d3


--
nosy: +vstinner

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue38629] float is missing __ceil__() and __floor__(), required by numbers.Real

2019-12-15 Thread STINNER Victor

STINNER Victor  added the comment:

Thanks Batuhan Taşkaya for the implementation, and thanks Ran Benita for the 
feature request :-)

--
resolution:  -> fixed
stage: patch review -> resolved
status: open -> closed
versions: +Python 3.9

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue38629] float is missing __ceil__() and __floor__(), required by numbers.Real

2019-10-31 Thread Vedran Čačić

Vedran Čačić  added the comment:

However, this is an instance of a general problem: whenever we want to strongly 
type (via dunders) protocols that specialcase builtin types, we will have to 
choose between three options:

* special case them also in typing engine, complicating the typing engine
* implement dummy dunders, puzzling readers of the code
* implement dunders that do the right thing but never actually execute, 
puzzling Serhiy (and probably others)
* implement dunders that are actually called (un-specialcasing builtin types), 
slowing down the common path

Do we have a preference for a "default" position when we encounter such 
problems in the future? Of course, we can override it on a case-by-case basis 
in the presence of good arguments, but still, a default would be nice to have.

I don't know much about static typing (which is why I loved Python until this 
typing craze happened:), but it seems to me that we might have another option: 
we can currently say that a type might be a virtual subclass of an abstract 
class in more than one way, right? For example, we still support old-style 
iterators (via __getitem__ and IndexError), IIRC. So, can we say that a type 
can implement numbers.Real also in two ways: by having some dunders, or by 
being (a literal or a subtype of) float?

--
nosy: +veky

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue38629] float is missing __ceil__() and __floor__(), required by numbers.Real

2019-10-30 Thread Batuhan


Batuhan  added the comment:

$ ./python -m pyperf timeit -s "from math import floor" --duplicate 100 
"floor(12345.6)"
Before:  Mean +- std dev: 52.5 ns +- 2.6 ns
After:  Mean +- std dev: 71.0 ns +- 1.7 ns

$ ./python -m pyperf timeit -s "from math import ceil" --duplicate 100 
"ceil(12345.6)"
Before:  Mean +- std dev: 51.2 ns +- 1.5 ns
After:  Mean +- std dev: 74.4 ns +- 2.2 ns

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue38629] float is missing __ceil__() and __floor__(), required by numbers.Real

2019-10-29 Thread Mark Dickinson


Mark Dickinson  added the comment:

> If float.__ceil__ will be executed it will add significant overhead for 
> creating and executing the method object.

Yes, I'd definitely like to see timings; I think Victor already asked for those 
on the PR.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue38629] float is missing __ceil__() and __floor__(), required by numbers.Real

2019-10-29 Thread Serhiy Storchaka


Serhiy Storchaka  added the comment:

Oh, you are right. I misunderstood the original issue and thought that the code 
first checks PyFloat_Check() or PyFloat_CheckExact().

If float.__ceil__ will be executed it will add significant overhead for 
creating and executing the method object.

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue38629] float is missing __ceil__() and __floor__(), required by numbers.Real

2019-10-29 Thread Mark Dickinson


Mark Dickinson  added the comment:

> I have doubts about adding a C code which is never even executed.

My reading of the PR is that it *would* be executed: the math module first 
looks for the __floor__ special method, then falls back to using the libm floor 
if that doesn't exist. Am I missing something?

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue38629] float is missing __ceil__() and __floor__(), required by numbers.Real

2019-10-29 Thread Serhiy Storchaka


Serhiy Storchaka  added the comment:

If float.__ceil__ is only needed for typeshed, maybe add a special case for 
typeshed?

I have doubts about adding a C code which is never even executed.

--
nosy: +serhiy.storchaka

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue38629] float is missing __ceil__() and __floor__(), required by numbers.Real

2019-10-29 Thread Batuhan


Change by Batuhan :


--
keywords: +patch
pull_requests: +16511
stage:  -> patch review
pull_request: https://github.com/python/cpython/pull/16985

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue38629] float is missing __ceil__() and __floor__(), required by numbers.Real

2019-10-29 Thread Karthikeyan Singaravelan


Change by Karthikeyan Singaravelan :


--
nosy: +mark.dickinson

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue38629] float is missing __ceil__() and __floor__(), required by numbers.Real

2019-10-29 Thread Ran Benita


Ran Benita  added the comment:

You can take it - thanks!

--

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue38629] float is missing __ceil__() and __floor__(), required by numbers.Real

2019-10-29 Thread Batuhan


Batuhan  added the comment:

Ran, do you want to work on this or can i take it?

--
nosy: +BTaskaya

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue38629] float is missing __ceil__() and __floor__(), required by numbers.Real

2019-10-29 Thread Ran Benita


New submission from Ran Benita :

The numbers.Real ABC requires the __ceil__ and __floor__ methods 
(https://github.com/python/cpython/blob/v3.8.0/Lib/numbers.py#L178-L186), 
however, the float type does not have them.

In regular Python, this is not a problem, because math.ceil() and math.floor() 
special-case float and work on it directly, and numbers.Real is implemented on 
float by explicitly registering it (so it's not checked that all required 
methods are implemented).

Where it becomes a (minor) problem is in typeshed, where the type checker 
*does* check that all abstract methods are implemented. So, because float is 
missing these two, typeshed cannot have float implement numbers.Real.

Refs: https://github.com/python/typeshed/issues/3195

--
components: Interpreter Core, Library (Lib)
messages: 355642
nosy: bluetech
priority: normal
severity: normal
status: open
title: float is missing __ceil__() and __floor__(), required by numbers.Real
type: behavior

___
Python tracker 

___
___
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com