-
-
Notifications
You must be signed in to change notification settings - Fork 30.6k
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
Readonly properties should be marked as such in help() #80582
Comments
It is common to create read-only properties with the '@Property' decoration but the existing help() output doesn't annotate them as such. One way to go is to annotate each one separately: | ---------------------------------------------------------------------- | Data descriptors inherited from _IPAddressBase:
|
| compressed (read-only property) <== NEW ANNOTATION
| Return the shorthand version of the IP address as a string.
|
| exploded (read-only property) <== NEW ANNOTATION
| Return the longhand version of the IP address as a string.
|
| reverse_pointer (read-only property) <== NEW ANNOTATION
| The name of the reverse DNS pointer for the IP address, e.g.:
| >>> ipaddress.ip_address("127.0.0.1").reverse_pointer
| '1.0.0.127.in-addr.arpa'
| >>> ipaddress.ip_address("2001:db8::1").reverse_pointer
| '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' Another way to go is to break the data descriptor section into two sections --- isolate those that define __set__ or __delete__ from those that don't. For example, given this code: class A:
'Variety of descriptors and method'
__slots__ = '_w', '_x'
def __init__(self, w: int, x: str):
'initializer'
self.w = w
self.x = x
@classmethod
def cm(cls, u):
'do something with u'
return cls(u * 4)
@staticmethod
def sm(v):
'do something with v'
return v * 3
@property
def rop(self):
'computed field'
return self._w * 2
@property
def wandr(self):
'managed attribute'
return self._w
@wandr.setter
def wandr(self, w):
self._w = w Produce this help output: Help on class A in module __main__: class A(builtins.object)
| A(w: int, x: str)
|
| Variety of descriptors and method
|
| Methods defined here:
|
| __init__(self, w: int, x: str)
| initializer
|
|
|
For property objects, we have to look at *fset* and *fdel* to find-out whether they are assignable: >>> A.rop.fset is None
True
>>> A.wandr.fset is None
False |
+1 but can we do the same thing with the PyGetSetDef declaration for the C Part? |
The would likely take an API change. For now, using only what is already exposed in Python, we can only partition data descriptors in two groups:
Example in the latter category, >>> t = time.localtime()
>>> hasattr(type(t).tm_sec, '__set__')
True
>>> t.tm_sec = 31
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
t.tm_sec = 31
AttributeError: readonly attribute |
Hi Raymond, About the C API, I wanted to know that because I started to use neovim But we have the result from Sphinx, because the C part is described in So, thank you for your PR. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: