簡體   English   中英

如何通過參數化它們來組合python腳本?

[英]How to combine python scripts by parameterizing them?

我有多個腳本,它們在調用python腳本( https://github.com/alvations/meanie )時,以給定的數字列表作為參數來計算不同的均值:

例如, harmonic_mean()

# -*- coding: utf-8 -*-

import math

def harmonic_mean(x): # x is a list of values.
  """ Returns the harmonic mean given a list of values. """
  return len(x) / sum([1/i for i in x])

def main(means):
  print "Input:", means
  means = map(float,means)
  print "harmonic mean = ", harmonic_mean(means)

if __name__ == '__main__':
  import sys
  if len(sys.argv) < 2:
    sys.stderr.write('Usage: python %s mean1 mean2 mean3 ... \n' % sys.argv[0])
    sys.exit(1)
  main(sys.argv[1:])

root_mean_square()

# -*- coding: utf-8 -*-

import math

def root_mean_square(x): # x is a list of values.
  """ Returns the root mean square (rms) given a list of values. """
  return math.sqrt(sum([i*i for i in x])/len(x))

def main(means):
  print "Input:", means
  means = map(float,means)
  print "root mean square = ", root_mean_square(means)

if __name__ == '__main__':
  import sys
  if len(sys.argv) < 2:
    sys.stderr.write('Usage: python %s mean1 mean2 mean3 ... \n' % sys.argv[0])
    sys.exit(1)
  main(sys.argv[1:])

如您所見,這兩個腳本執行的功能完全相同,只是調用了不同的mean()函數,並在main()打印了不同的輸出。 如何將它們組合在一起,並允許用戶在控制台/終端上調用它們時給出均值選項參數/自變量? 例如,合並后的腳本是調用meannie.py

$ python meanie.py harmonic 1 2 3
$ python meanie.py hm 1 2 3 

上面的命令應提供與調用相同的輸出(這是用戶現在如何調用諧和_mean()腳本的方式):

$ python hm.py 1 2 3 

Python具有一流的功能; 它們是與其他所有事物一樣的對象,可以以相同的方式傳遞。 因此,您只需要一種將用戶輸入映射到指定函數,然后將其傳遞到main函數的方法:

def harmonic_mean(x):
    ...

def root_mean_square(x):
    ...

MEAN_FUNCS_MAP = {
    'hm': harmonic_mean,
    'harmonic': harmonic_mean,
    'rms':  root_mean_square,
}

def main(mean_fn, means):
    print "Input:", means
    means = map(float,means)
    print "root mean square = ", mean_fn(means)    

if __name__ == '__main__':
    import sys
    if len(sys.argv) < 3 or sys.argv[1] not in MEAN_FUNCS_MAP:
        sys.stderr.write('Usage: python %s <function> <mean1> <mean2> <mean3> ... \n' % sys.argv[0])
        sys.exit(1)
    main( MEAN_FUNCS_MAP[sys.argv[1]], sys.argv[2:] )

您可能還應該看看argparse模塊,它比滾動您自己的命令行界面要容易得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM