Skip to main content
 首页 » 编程设计

python之函数python的动态参数数组

2025年05月04日11sharpest

我在 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=") 

这可能吗?或者还有其他方法吗?

请您参考如下方法:

首先,一些风格要点:

  • 您在 extractParam 中处理 varName 的方式丑陋且令人困惑。我花了一段时间才弄清楚您要做什么(即考虑到 extractParam 可能找不到任何数据这一事实)。目前,最好直接处理而不是尝试调用函数。

  • range(len( 你正在做的事 has to stop .

  • 您不需要在拆分之前去除该行 - 任何前导和尾随空格都会在拆分操作期间消失。结果中不会有任何额外的空字符串。

  • sline 这个名字实在是太丑了。您已将 行 拆分为单词;为什么不将单词称为 words? (在任何情况下,都不要使用缩写和混淆。否则你会得到像 sline 这样实际上不是单词的东西。)

  • 在 Python 中,我们不对函数使用 namesLikeThis(或其他任何东西;尽管我们确实对类使用 NamesLikeThis,首字母大写) .我们使用 names_like_this。

另外,看起来你好像在反复尝试替换

也就是说,您提出的方法很好。请注意,由于我们事先不知道将提取多少项,因此我们不能将每一项都扔到一个单独的变量中。但我们可以通过返回一个 dict 轻松解决这个问题。

我的方法如下:我遍历 names,每次尝试在 line 中找到相应的词。找到一个后,我将默认的 value 替换为 0,完成此检查后,我将相应的键值对插入到返回的 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 

这可能会有很大的改进,但很大程度上取决于您的具体规范。我试图创建尽可能符合您的基本逻辑的内容。