Skip to main content
better subroutines
Source Link
Reinderien
  • 71.2k
  • 5
  • 76
  • 257
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()
added 50 characters in body
Source Link
Reinderien
  • 71.2k
  • 5
  • 76
  • 257
$ 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
Source Link
Reinderien
  • 71.2k
  • 5
  • 76
  • 257

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