函数python的动态参数数组

时间:2013-12-29 14:58:59

标签: python

我在python中有以下功能:

def extractParam(word, varName, stringToReplace):
   if word.startswith(stringToReplace):
      varName=int (word.replace(stringToReplace, ''))
   return varName    

def getMParams(line):
  l = r = b = t = 0
  sline = line.strip().split()
  for i in range(len(sline)):
    l = extractParam(sline[i], l, "l=")     
    r = extractParam(sline[i], r, "r=")       
    b = extractParam(sline[i], b, "b=")     
    t = extractParam(sline[i], t, "t=")   
  return l, r, b, t

def getIterParams (line):
  width = height = stride = x = y = 0
  sline = line.strip().split()
  for i in range(len(sline)):
     width  = extractParam(sline[i], width, "width=")     
     height = extractParam(sline[i], height,"height=")       
     stride = extractParam(sline[i], stride,"stride=")     
     x      = extractParam(sline[i], x,     "x=")   
     y      = extractParam(sline[i], y,     "y=")     
  return width, height , stride, x,  y 

函数getMparams和getIterParams是完全相同的,我的问题是如果有一种方法可以创建一个替换它们的函数,我正在考虑这样的事情:

def func (line, params)
    //params is an array of parameters (i.e [l,r,b,t] or [width,height,stride,x,y])
    //init all params
    sline = line.strip().split()
    for i in range(len(sline)):
      //for everyParam:
        param = extractParam(sline[i],param,"param=")

有可能吗?还是有另一种方法可以做到这一点?

1 个答案:

答案 0 :(得分:1)

首先,一些风格点:

  • 您在varName中处理extractParam的方式既丑陋又令人困惑。我花了一些时间来弄清楚你想要做什么(即,允许extractParam可能找不到任何数据这一事实。现在,可以直接处理,而不是尝试调用函数。

  • 您正在做的range(len(has to stop

  • strip之前,您不需要split行 - 任何前导和尾随空格在分割操作期间都会消失。你不会在结果中得到任何额外的空字符串。

  • 名称sline简直太丑了。你已将line分成单词;为什么不把这些词称为words? (无论如何,不​​要使用缩写和混乱的东西。否则你会得到sline之类的东西,而不是真正的单词。)

  • 我们不会将namesLikeThis用于函数(或其他任何内容;尽管我们在Python中使用NamesLikeThis,并使用起始大写字母表示类)。我们使用names_like_this

此外,您似乎反复尝试替换

那就是说,你提议的方法很好。请注意,由于我们事先并不知道将提取多少项,因此我们不能只将每个项目分成一个单独的变量。但我们可以通过返回dict来轻松解决此问题。

我的方法如下:我迭代names,并且每次尝试在line中找到相应的单词。找到一个后,我替换0的默认value,完成此检查后,我将相应的键值对插入到返回的result中。我也采取了一种更简单的方法来切割等号周围的单词。

def extract_params(line, names):
    words = line.split()
    result = {}
    for name in names:
        value = 0
        for word in words:
            maybe_name, equals, maybe_value = word.partition('=')
            if maybe_name == name and equals == '=':
                value = maybe_value
        result[name] = value
    return result

这可能会有相当大的改进,但很大程度上取决于您的确切规格。我尝试尽可能地创建符合基本逻辑的东西。