Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.7k
gh-108963: using random to generate unique string in sys.intern test#109491
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 ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Conversation
vstinner commentedSep 18, 2023
This change hides the issue that the test actually leaks memory: intern a string which is then only released at Python exit. Can we add a private deintern() function in _testcapi? Or run the test in a subprocess? Well, i don't know that it's a big deal, this change is ooookay-ish. |
Lib/test/test_sys.py Outdated
| INTERN_NUMRUNS+=1 | ||
| self.assertRaises(TypeError,sys.intern) | ||
| s="never interned before"+str(INTERN_NUMRUNS) | ||
| s="never interned before"+str(random.random()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
I would prefer using random.randint(), for example 10**9 to have 9 random digits. I prefer to avoid float when possible 😁 Same below.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Done
serhiy-storchakaSep 19, 2023 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
But this increases the probability of random failure from 1/253 (about 1/1016) to 1/(9*10**8). If run the test every second, there will be a failure every 30 years in average.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
On my machine, therandom.random() returns something like0.35934878814573135, which have 18 digits (with the first zero). So can we just increase the max range to10 ** 18 to keep the random resolution almost like as therandom.random()?
Lib/test/test_sys.py Outdated
| deftest_intern(self): | ||
| self.assertRaises(TypeError,sys.intern) | ||
| s="never interned before"+str(random.int(10**8,10**9)) | ||
| s="never interned before"+str(random.randint(10**8,10**9)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
If the intention is to generate random 9-digit numbers, userandrange() instead ofrandint().
Lib/test/test_sys.py Outdated
| deftest_intern(self): | ||
| self.assertRaises(TypeError,sys.intern) | ||
| s="never interned before"+str(random.random()) | ||
| s="never interned before"+str(random.int(10**8,10**9)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
random.int doesn't exist. What's the point of putting a minimum at 10**8? Why not 0?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
There is a more recent commit in the PR fixed the bug. The minimal start is for ensure the random parts have 9 digits, I think it's more consistent.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
i don't think that the string length (number of random int digits) matters here, does it?
Lib/test/test_sys.py Outdated
| INTERN_NUMRUNS+=1 | ||
| self.assertRaises(TypeError,sys.intern) | ||
| s="never interned before"+str(INTERN_NUMRUNS) | ||
| s="never interned before"+str(random.randrange(0,10**18)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Oh, for me 9 digits was already way enough. 18 digits is just too much 😁 You can just pass the max value:
| s="never interned before"+str(random.randrange(0,10**18)) | |
| s="never interned before"+str(random.randrange(10**9)) |
vstinner left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
LGTM.
It makes me sad to leak memory. But I'm not sure about a private API to de-intern a string. I'm not sure of the consequences.
miss-islington commentedOct 2, 2023
miss-islington commentedOct 2, 2023
Sorry,@aisk and@vstinner, I could not cleanly backport this to |
… test (python#109491)(cherry picked from commit44b1e4e)
GH-110216 is a backport of this pull request to the3.12 branch. |
Uh oh!
There was an error while loading.Please reload this page.