【问题标题】:String concatenation inside function arguments函数参数内的字符串连接
【发布时间】:2018-11-18 13:05:09
【问题描述】:

为什么下面的代码会抛出 undefined name sheetname?

def PlotChart(charttype = 'line', sheetname = 'CA', values = '='+sheetname+'!$M$1:$M$400'):

有什么办法可以解决这个问题?

【问题讨论】:

  • 定义sheetname
  • sheetname = 'CA' 不是吗?
  • 不,那行不通。我认为你应该在调用PlotChart之前定义你想要发送给value的正确数据
  • 我真的认为提供有关预期输出的更多信息会真正帮助我们帮助您。

标签: python string function xlsxwriter


【解决方案1】:

默认参数值在函数被定义时被评估,因此你不能访问另一个只有在函数被调用时才知道的参数值。

我建议使用None 作为默认值,然后再设置适当的默认值。

def PlotChart(charttype='line', sheetname='CA', values=None):
    if values is None:
        values = '=' + sheetname + '!$M$1:$M$400'
    ...

或者稍微短一点,使用or 来获得一个“默认”值(不过这也将替换空的""

    values = values or ('=' + sheetname + '!$M$1:$M$400')

如果sheetname 必须始终是values 的一部分,您还可以期待一个格式字符串,然后在调用函数后使用sheetname 的实际值对其进行格式化:

def PlotChart(charttype='line', sheetname='CA', values='={}!$M$1:$M$400'):
    values = values.format(sheetname)
    ...

【讨论】:

  • 最后一个很脆弱;如果调用者提供了不兼容的格式字符串,它将中断。我看不出有任何理由使用明确检查None 值的第一个建议。
  • @chepner 是的,它很脆弱,格式可能应该在文档字符串中解释。一个好处可能是默认值比使用None 并在代码中的某处(最好在第一行)检查它时更明显。 (另一方面,当使用None 时,也可以解释文档字符串中的 actual 默认值。)
【解决方案2】:

如果值中总是有工作表名称

你应该在函数内部执行加法:

def PlotChart(charttype = 'line', sheetname = 'CA', values = '!$M$1:$M$400'):
    values = '=' + sheetname + values 

如果您希望用户完全更改值:

你应该用你想要的调用函数

def PlotChart(values, charttype = 'line', sheetname = 'CA'):
    ...

PlotChart(charttype = 'line', sheetname = 'CA', values = '=' + sheetname + values)

如果你想要两者:

tobias_k 答案是最好的:使用无

def PlotChart(charttype='line', sheetname='CA', values=None):
    if values is None:
        values = '='+sheetname+'!$M$1:$M$400'):
    ...

【讨论】:

  • 如果用户想为values 使用不同的值怎么办?
  • 我该怎么做?
  • 您还可以通过期望值的格式字符串来使其更通用:values='={}!$M$1:$M$400'
猜你喜欢
  • 1970-01-01
  • 2021-01-07
  • 2020-03-19
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 2016-04-23
相关资源
最近更新 更多