skeleton.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. # -*- coding: utf-8 -*-
  2. """
  3. This is a skeleton file that can serve as a starting point for a Python
  4. console script. To run this script uncomment the following lines in the
  5. [options.entry_points] section in setup.cfg:
  6. console_scripts =
  7. fibonacci = hanna_rechnet.skeleton:run
  8. Then run `python setup.py install` which will install the command `fibonacci`
  9. inside your current environment.
  10. Besides console scripts, the header (i.e. until _logger...) of this file can
  11. also be used as template for Python modules.
  12. Note: This skeleton file can be safely removed if not needed!
  13. """
  14. import argparse
  15. import sys
  16. import logging
  17. from hanna_rechnet import __version__
  18. __author__ = "Thomas Verchow"
  19. __copyright__ = "Thomas Verchow"
  20. __license__ = "mit"
  21. _logger = logging.getLogger(__name__)
  22. def fib(n):
  23. """Fibonacci example function
  24. Args:
  25. n (int): integer
  26. Returns:
  27. int: n-th Fibonacci number
  28. """
  29. assert n > 0
  30. a, b = 1, 1
  31. for i in range(n-1):
  32. a, b = b, a+b
  33. return a
  34. def parse_args(args):
  35. """Parse command line parameters
  36. Args:
  37. args ([str]): command line parameters as list of strings
  38. Returns:
  39. :obj:`argparse.Namespace`: command line parameters namespace
  40. """
  41. parser = argparse.ArgumentParser(
  42. description="Just a Fibonacci demonstration")
  43. parser.add_argument(
  44. "--version",
  45. action="version",
  46. version="hanna_rechnet {ver}".format(ver=__version__))
  47. parser.add_argument(
  48. dest="n",
  49. help="n-th Fibonacci number",
  50. type=int,
  51. metavar="INT")
  52. parser.add_argument(
  53. "-v",
  54. "--verbose",
  55. dest="loglevel",
  56. help="set loglevel to INFO",
  57. action="store_const",
  58. const=logging.INFO)
  59. parser.add_argument(
  60. "-vv",
  61. "--very-verbose",
  62. dest="loglevel",
  63. help="set loglevel to DEBUG",
  64. action="store_const",
  65. const=logging.DEBUG)
  66. return parser.parse_args(args)
  67. def setup_logging(loglevel):
  68. """Setup basic logging
  69. Args:
  70. loglevel (int): minimum loglevel for emitting messages
  71. """
  72. logformat = "[%(asctime)s] %(levelname)s:%(name)s:%(message)s"
  73. logging.basicConfig(level=loglevel, stream=sys.stdout,
  74. format=logformat, datefmt="%Y-%m-%d %H:%M:%S")
  75. def main(args):
  76. """Main entry point allowing external calls
  77. Args:
  78. args ([str]): command line parameter list
  79. """
  80. args = parse_args(args)
  81. setup_logging(args.loglevel)
  82. _logger.debug("Starting crazy calculations...")
  83. print("The {}-th Fibonacci number is {}".format(args.n, fib(args.n)))
  84. _logger.info("Script ends here")
  85. def run():
  86. """Entry point for console_scripts
  87. """
  88. main(sys.argv[1:])
  89. if __name__ == "__main__":
  90. run()