【问题标题】:String injection of Python3 command-line args [duplicate]Python3命令行参数的字符串注入[重复]
【发布时间】:2018-12-04 08:29:20
【问题描述】:

Python 新手,我有以下脚本:

#!/usr/bin/env python3
import sys

env = sys.argv[1:]  # The name of the environment we're executing over ('Dev', 'Test', 'Prod', etc)

print('Executing against ' + env)

上面,应该使用env 参数调用脚本,然后将其打印到STDOUT。

有没有更优雅的方式将env 变量注入到正在打印的字符串中(所以我没有那种讨厌的+ 连接)?

【问题讨论】:

  • 你可以使用.format
  • 如果您用逗号替换“+”并删除“反对”之后的尾随空格,这将起作用。您也可以使用 str.format,如下所述:python-course.eu/python3_formatted_output.php
  • 请注意推荐 f-strings 的链接问题的答案。它们可能是格式化字符串的最简单方法,但仅适用于 Python 3.6+ f"Executing against {env}"

标签: python python-3.x concatenation


【解决方案1】:

+的问题是第二个参数必须是字符串,否则会报错。如果这不是问题,使用+ 就可以了。但是,还有其他通常更惯用的方式:

1.) print 函数可以接受多个参数,这些参数用空格连接:

print('Executing against', env)

2.) “旧式”插值:

print('Executing against %s' % env)

右侧也可以在一个元组中接受多个参数。所以为了防止参数本身是一个元组的可能性,你通常总是把你的变量放在一个元组中:

print('Executing against %s' % (env,))

3.) 更现代的方式是使用 .format 及其生态系统(有神奇的 __format__ 方法和其他您通常不需要知道但给您很大的灵活性的东西):

print('Executing against {}'.format(env))

4.) Python 3.6 及更高版本:.format() 的语法糖。您现在可以直接将变量,甚至整个表达式放入字符串中,方法是将其设为格式字符串(以 f 为前缀):

print(f'Executing against {env}')

【讨论】:

    【解决方案2】:

    试试这个:

    print('Executing against {}'.format(env))
    

    【讨论】:

      猜你喜欢
      • 2022-10-02
      • 2011-04-03
      • 1970-01-01
      • 2014-03-29
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      相关资源
      最近更新 更多