import argparse
import secrets
import sys
import typing
def positive(arg: str) -> int:
value = int(arg)
if value < 1:
raise ValueError(f'Must pass a positive integer, not {value}')
return value
def get_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description='Generate token data from the secrets module',
)
parser.add_argument(
'-b', '--bytes', type=positive, action='append', default=[],
)
parser.add_argument(
'-x', '--hex', type=positive, action='append', default=[],
)
parser.add_argument(
'-u', '--urlsafe', type=positive, action='append', default=[],
)
return parser.parse_args()
def mainrender() -> None bytes_: list[int],
argshex_: =list[int],
get_args() urlsafe: list[int],
out: typing.TextIO,
) -> None:
if len(args.bytesbytes_) > 0:
sys.stdoutout.buffer.write(b'\n'.join(
secrets.token_bytes(size)
for size in args.bytesbytes_
))
sys.stdoutout.buffer.flush()
print(file=out)
if len(args.hexhex_) > 0:
print('\n'.join(
secrets.token_hex(size) for size in args.hexhex_
), file=out)
if len(args.urlsafe) > 0:
print('\n'.join(
secrets.token_urlsafe(size) for size in args.urlsafe
), file=out)
def main() -> None:
args = get_args()
render(bytes_=args.bytes, hex_=args.hex, urlsafe=args.urlsafe, out=sys.stdout)
if __name__ == '__main__':
main()
import argparse
import secrets
import sys
def positive(arg: str) -> int:
value = int(arg)
if value < 1:
raise ValueError(f'Must pass a positive integer, not {value}')
return value
def get_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description='Generate token data from the secrets module',
)
parser.add_argument(
'-b', '--bytes', type=positive, action='append', default=[],
)
parser.add_argument(
'-x', '--hex', type=positive, action='append', default=[],
)
parser.add_argument(
'-u', '--urlsafe', type=positive, action='append', default=[],
)
return parser.parse_args()
def main() -> None:
args = get_args()
if len(args.bytes) > 0:
sys.stdout.buffer.write(b'\n'.join(
secrets.token_bytes(size)
for size in args.bytes
))
sys.stdout.buffer.flush()
print()
if len(args.hex) > 0:
print('\n'.join(
secrets.token_hex(size) for size in args.hex
))
if len(args.urlsafe) > 0:
print('\n'.join(
secrets.token_urlsafe(size) for size in args.urlsafe
))
if __name__ == '__main__':
main()
import argparse
import secrets
import sys
import typing
def positive(arg: str) -> int:
value = int(arg)
if value < 1:
raise ValueError(f'Must pass a positive integer, not {value}')
return value
def get_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description='Generate token data from the secrets module',
)
parser.add_argument(
'-b', '--bytes', type=positive, action='append', default=[],
)
parser.add_argument(
'-x', '--hex', type=positive, action='append', default=[],
)
parser.add_argument(
'-u', '--urlsafe', type=positive, action='append', default=[],
)
return parser.parse_args()
def render( bytes_: list[int],
hex_: list[int],
urlsafe: list[int],
out: typing.TextIO,
) -> None:
if len(bytes_) > 0:
out.buffer.write(b'\n'.join(
secrets.token_bytes(size)
for size in bytes_
))
out.buffer.flush()
print(file=out)
if len(hex_) > 0:
print('\n'.join(
secrets.token_hex(size) for size in hex_
), file=out)
if len(urlsafe) > 0:
print('\n'.join(
secrets.token_urlsafe(size) for size in urlsafe
), file=out)
def main() -> None:
args = get_args()
render(bytes_=args.bytes, hex_=args.hex, urlsafe=args.urlsafe, out=sys.stdout)
if __name__ == '__main__':
main()
$ python 292299.py -b 1 -b 2 -u 1 -u 2 -x 3 -x 4
▬
�♠
a606bc
0f7f54b6
pQ
Yk0
▬
�♠
a606bc
0f7f54b6
pQ
Yk0
$ python 292299.py -b 1 -b 2 -u 1 -u 2 -x 3 -x 4
▬
�♠
a606bc
0f7f54b6
pQ
Yk0
print(secrets.token_bytes(int(args[i+1])))
doesn't particularly work, or at least not in a form I'd expect. It's possible for a script to want to call this and read from stdout
in binary format, but that's not what your code does - instead, it basically prints the repr
of some bytes
, so some will be encoded and others won't. I imagine that a caller would either want raw binary, or use the hex version instead. With raw binary, you'll also want to make a decision (more carefully than I have) about how to separate different tokens - \n
risks being ambiguous.
Use the built-in argparse
. A caveat: unless you get much more creative, this is going to reorder command-line switches and group by type.
import argparse
import secrets
import sys
def positive(arg: str) -> int:
value = int(arg)
if value < 1:
raise ValueError(f'Must pass a positive integer, not {value}')
return value
def get_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description='Generate token data from the secrets module',
)
parser.add_argument(
'-b', '--bytes', type=positive, action='append', default=[],
)
parser.add_argument(
'-x', '--hex', type=positive, action='append', default=[],
)
parser.add_argument(
'-u', '--urlsafe', type=positive, action='append', default=[],
)
return parser.parse_args()
def main() -> None:
args = get_args()
if len(args.bytes) > 0:
sys.stdout.buffer.write(b'\n'.join(
secrets.token_bytes(size)
for size in args.bytes
))
sys.stdout.buffer.flush()
print()
if len(args.hex) > 0:
print('\n'.join(
secrets.token_hex(size) for size in args.hex
))
if len(args.urlsafe) > 0:
print('\n'.join(
secrets.token_urlsafe(size) for size in args.urlsafe
))
if __name__ == '__main__':
main()
▬
�♠
a606bc
0f7f54b6
pQ
Yk0