Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-88427: Deprecated socket.SocketType #126272

Open
wants to merge 16 commits into
base: main
Choose a base branch
from
Open

Conversation

rruuaanng
Copy link
Contributor

@rruuaanng rruuaanng commented Nov 1, 2024

I propose to deprecate socket.SocketType. There's no reason to publicly expose _socket.socket separately from socket.socket, the only type that moat users should care about.
SocketType isn't needed for type checking; socket.socket is itself a class and can be used in type annotations.

cc @JelleZijlstra

@rruuaanng rruuaanng changed the title gh88427: Deprecated socket.SocketType gh-88427: Deprecated socket.SocketType Nov 1, 2024
Copy link
Member

@ZeroIntensity ZeroIntensity left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SocketType isn't deprecated right now, so we can't remove it yet.

Please update the PR to raise a DeprecationWarning when accessing a SocketType (you can do this via a PEP-562 __getattr__), and then add the documentation notes.

@rruuaanng
Copy link
Contributor Author

Maybe we can wait for the promoter to answer. I won't open this PR before I decide whether to abandon or remove it.

@JelleZijlstra
Copy link
Member

I looked at the code again and agree with my opinion from 2021: it should be deprecated and eventually removed.

It could be useful to do a code search (e.g., GitHub code search, Hugo's top 5k pypi packages tool) to see how the name is being used.

A possible approach to deprecation could be to remove the current line adding it to _socket, and add a module __getattr__ to both the _socket and socket modules that raises a DeprecationWarning and then returns _socket.socket.

@rruuaanng
Copy link
Contributor Author

Okay, I'll re-revise this PR so that it throws a warning when calling this type. Call me back in this PR when we consider removing it in the future :)

Doc/library/socket.rst Outdated Show resolved Hide resolved
Lib/socket.py Outdated Show resolved Hide resolved
Lib/socket.py Outdated Show resolved Hide resolved
Doc/library/socket.rst Outdated Show resolved Hide resolved
Lib/socket.py Outdated Show resolved Hide resolved
@rruuaanng
Copy link
Contributor Author

It seems that the module __getattr__ only works for attributes that do not exist, which makes it necessary to remove the export in socketmodule. But it triggers a deprecation warning. Emmm...

@picnixz
Copy link
Contributor

picnixz commented Nov 2, 2024

It seems that the module getattr only works for attributes that do not exist, which makes it necessary to remove the export in socketmodule. But it triggers a deprecation warning. Emmm...

It works for any kind of attributes. Please, read PEP-562 for examples on how to use it.

@rruuaanng
Copy link
Contributor Author

rruuaanng commented Nov 2, 2024

It seems that the module getattr only works for attributes that do not exist, which makes it necessary to remove the export in socketmodule. But it triggers a deprecation warning. Emmm...

It works for any kind of attributes. Please, read PEP-562 for examples on how to use it.

I read the document and modified it. But why does it trigger this

Traceback (most recent call last):
  File "D:\a\cpython\cpython\Lib\test\pythoninfo.py", line 1062, in collect_info
    collect_func(info_add)
    ~~~~~~~~~~~~^^^^^^^^^^
  File "D:\a\cpython\cpython\Lib\test\pythoninfo.py", line 727, in collect_test_socket
    from test import test_socket
  File "D:\a\cpython\cpython\Lib\test\test_socket.py", line 201, in <module>
    HAVE_SOCKET_CAN = _have_socket_can()
  File "D:\a\cpython\cpython\Lib\test\test_socket.py", line 104, in _have_socket_can
    s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
  File "D:\a\cpython\cpython\Lib\socket.py", line 242, in __init__
    _socket.socket.__init__(self, family, type, proto, fileno)
    ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: 'NoneType' object cannot be interpreted as an integer

Edit
It seems to be a consistent bug since I opened the PR.

@ZeroIntensity
Copy link
Member

I think you need to raise an AttributeError from the __getattr__ if it isn't SocketType.

@rruuaanng rruuaanng marked this pull request as ready for review November 2, 2024 01:50
@Wulian233
Copy link
Contributor

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants