| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
`datetime.strftime()` takes `format: str` as a positional argument.
In [1]: from datetime import datetime
In [2]: a = datetime.now()
In [3]: a.strftime(fmt='%c')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-b6d3aae8d1f0> in <module>
----> 1 a.strftime(fmt='%c')
TypeError: strftime() missing required argument 'format' (pos 1)
In [4]: a.strftime(format='%c')
Out[4]: 'Tue Nov 16 17:50:47 2021'
|
Sorry, something went wrong.
|
Same goes for datetime.time.strftime and datetime.date.strftime |
Sorry, something went wrong.
|
Unfortunately, it's not that easy. The pure-Python version of datetime et al. names this argument fmt. It's probably safest to make this a positional-only argument if the two available runtime versions of this method don't match. |
Sorry, something went wrong.
|
True. I dived into the source to see where, if any, a C module gets imported. It's towards the end. That implementation is the one that uses format, and the one in the pure python version uses fmt. Maybe typeshed could check for datetime.__doc__ (see the last line in datetime.py) to see what version of the module is imported. |
Sorry, something went wrong.
|
To me, a positional only argument makes sense the most. I would want to get errors for both strftime(format="lol") and strftime(fmt="lol"), as neither of them will work correctly in all cases. |
Sorry, something went wrong.
Personally, I think it's a bit of a bug that the parameter has a different name in the C implementation and the Python implementation; I'd be inclined to report it as a bug on bugs.python.org and try to get that resolved. |
Sorry, something went wrong.
Although strftime(format="lol") could easily be reduced to "lol". 😈 (Sorry, I'm tired ...) |
Sorry, something went wrong.
I'd be with you on that, but generally, bugfixes don't happen very fast. (I like to pass positional arguments, makes the code more readable) |
Sorry, something went wrong.
|
Seems like there already is an open BPO issue about this here |
Sorry, something went wrong.
|
As mentioned in the other issue, I'm for changing it to format: str. |
Sorry, something went wrong.
|
While I would prefer we change this to a positional only for now, I'm fine with changing it to format per the linked bpo issue. |
Sorry, something went wrong.
|
I can make the correction for date.strftime() and time.strftime() as well, but there seems to be a conflict now which I don't really understand. It looks as though a couple lines disappeared from the master branch? |
Sorry, something went wrong.
Yes, I, er, just deleted datetime.datetime.strftime, as it's inherited from datetime.date at runtime, so doesn't need to be redefined. It was this PR: #6320. The only functions you should need to alter are date.strftime and time.strftime. |
Sorry, something went wrong.
|
thereifixedit™ |
Sorry, something went wrong.
|
I agree with Akuli that this should be positional-only till the fix for https://bugs.python.org/issue41260 is merged, at which point we can branch on sys.version (and yes, I agree that format is what CPython should prefer). |
Sorry, something went wrong.
|
I still think a positional-only parameter would be better for now, but I'm fine with it either way. |
Sorry, something went wrong.
| def day(self) -> int: ... | ||
| def ctime(self) -> str: ... | ||
| def strftime(self, fmt: str) -> str: ... | ||
| def strftime(self, format: str) -> str: ... |
There was a problem hiding this comment.
| def strftime(self, format: str) -> str: ... | |
| def strftime(self, __format: str) -> str: ... |
Let's make it positional-only as discussed.
Sorry, something went wrong.
There was a problem hiding this comment.
Quoting https://bugs.python.org/msg373421, specifically:
I think in typeshed they can safely change from fmt to format even today (which would almost certainly be more accurate to end user use cases).
What do you have against this?
Sorry, something went wrong.
There was a problem hiding this comment.
Type checking is all about warning users about situations where their code could lead to unexpected errors. Passing a keyword argument to this parameter will currently cause code to raise an error sometimes (but not all the time, or even most of the time), as not all systems can be guaranteed to use the C implementation of datetime (this is partly why the Python implementation exists alongside the C implementation). If a user passes a positional argument to this parameter, however, then there is no possibility of an error. So, it seems correct that, as the situation currently stands, a type-checker should raise an error if a keyword argument is passed to this parameter, as doing so could in some situations lead to unexpected errors.
Sorry, something went wrong.
There was a problem hiding this comment.
It's definitely better than the current situation to have the parameter named format, but I agree that the best option for now is to have it as a positional-only parameter in the stub.
Sorry, something went wrong.
| @classmethod | ||
| def fromisoformat(cls: Type[_S], time_string: str) -> _S: ... | ||
| def strftime(self, fmt: str) -> str: ... | ||
| def strftime(self, format: str) -> str: ... |
There was a problem hiding this comment.
| def strftime(self, format: str) -> str: ... | |
| def strftime(self, __format: str) -> str: ... |
Sorry, something went wrong.
|
According to mypy_primer, this change has no effect on the checked open source code. 🤖🎉 |
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
datetime.strftime() takes format: str as a positional argument.