Skip to content

Instantly share code, notes, and snippets.

@dckc
Last active December 18, 2019 12:01
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dckc/d58a04b154d44d46de9abcda84b2a2f0 to your computer and use it in GitHub Desktop.
Save dckc/d58a04b154d44d46de9abcda84b2a2f0 to your computer and use it in GitHub Desktop.
"""Simple fizzbuzz generator.
The game proceeds with players announcing numbers increasing
sequentially, except for multiples of 3 and 5:
>>> usage = 'fizzbuzz 1 20'
>>> from io import StringIO; stdout = StringIO()
>>> main(usage.split(), stdout)
>>> print(stdout.getvalue())
... #doctest: +ELLIPSIS
1
2
fizz
4
buzz
fizz
7
...
14
fizzbuzz
16
...
"""
def main(argv, stdout):
[lo_, hi_] = argv[1:3]
lo, hi = int(lo_), int(hi_)
for word in fizzbuzz(lo, hi):
print(word, file=stdout)
def fizzbuzz(lo, hi):
"""
>>> list(fizzbuzz(1, 6))
[1, 2, 'fizz', 4, 'buzz']
"""
for n in range(lo, hi):
if n % 3 == 0 and n % 5 == 0:
yield "fizzbuzz"
elif n % 3 == 0:
yield "fizz"
elif n % 5 == 0:
yield "buzz"
else:
yield n
if __name__ == '__main__':
def _script_io():
from sys import argv, stdout
main(argv, stdout)
_script_io()
@md2perpe
Copy link

I browsed your article but did not understand why you introduce _script_io() instead of just use

if __name__ == '__main__':
  import sys
  main(sys.argv, sys.stdout)

@dckc
Copy link
Author

dckc commented Jul 25, 2019

because then sys would be visible at module scope and some function in the middle of the module could just refer to sys.stdin or sys.version or the like without having that authority passed in explicitly. That would violate ocap discipline, making the code hard to audit and test.

@dckc
Copy link
Author

dckc commented Jul 25, 2019

but yes, I neglected to explain that.

@md2perpe
Copy link

Okay, then I get it.

@dckc
Copy link
Author

dckc commented Jul 25, 2019

I suppose I could del _script_io before calling main() to avoid some risks.

This is still sort of voluntary compliance. Python is nearly impossible to completely secure. Only languages like monte, E, pony, and Joe-E actually enforce ocap discipline for us.

@dckc
Copy link
Author

dckc commented Jul 27, 2019 via email

@fernandezpablo85
Copy link

Yeah, found out that the explanation was in your post

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