我正在try 编写一个小脚本,它将自动化我需要编写的一些PHP样板文件.它应该将字符串code的副本写入输出文件,并为fields列表中的每个dict填写各种替换字段.

然而,我得到了一个错误:

Traceback (most recent call last):
    File "writefields.py", line 43, in <module>
        formatted = code.format(**field)
ValueError: unexpected '{' in field name

据我所知,在替换字段或dicts中都没有额外的大括号会导致问题,因此如果您有任何帮助,我们将不胜感激.

code = '''
// {label}
add_filter( 'submit_job_form_fields', 'frontend_add_{fieldname}_field' );
function frontend_add_{fieldname}_field($fields) {
    $fields['job']['job_{fieldname}'] = array(
        'label' => __('{label}', 'job_manager'),
        'type' => 'text',
        'required' => {required},
        'priority' => 7,
        'placeholder' => '{placeholder}'
    );
    return $fields;
}
add_filter( 'job_manager_job_listing_data_fields', 'admin_add_{fieldname}_field' );
function admin_add_{fieldname}_field( $fields ) {
  $fields['_job_{fieldname}'] = array(
    'label'       => __( '{label}', 'job_manager' ),
    'type'        => 'text',
    'placeholder' => '{placeholder}',
    'description' => ''
  );
  return $fields;
}
'''

fields = [
    {
        'fieldname': 'salary',
        'label': 'Salary ($)',
        'required': 'true',
        'placeholder': 'e.g. 20000',
    },
    {
        'fieldname': 'test',
        'label': 'Test Field',
        'required': 'true',
        'placeholder': '',
    }
]

with open('field-out.txt', 'w') as f:
    for field in fields:
        formatted = code.format(**field)
        f.write(formatted)
        f.write('\n')

推荐答案

您需要删除任何不属于格式占位符的{}.例如,你有:

function admin_add_{fieldname}_field( $fields ) {
    [....]
}

在绳子上.第一行末尾的{和最后一行的}不是占位符的一部分.将其分别替换为{{}}:

function admin_add_{fieldname}_field( $fields ) {{
    [....]
}}

把那些curl 的牙套叠起来,它们就逃脱了;最终输出将再次包含单个{}个字符.

在您使用的完整字符串中,应该是:

code = '''
// {label}
add_filter( 'submit_job_form_fields', 'frontend_add_{fieldname}_field' );
function frontend_add_{fieldname}_field($fields) {{
    $fields['job']['job_{fieldname}'] = array(
        'label' => __('{label}', 'job_manager'),
        'type' => 'text',
        'required' => {required},
        'priority' => 7,
        'placeholder' => '{placeholder}'
    );
    return $fields;
}}
add_filter( 'job_manager_job_listing_data_fields', 'admin_add_{fieldname}_field' );
function admin_add_{fieldname}_field( $fields ) {{
  $fields['_job_{fieldname}'] = array(
    'label'       => __( '{label}', 'job_manager' ),
    'type'        => 'text',
    'placeholder' => '{placeholder}',
    'description' => ''
  );
  return $fields;
}}
'''

Python-3.x相关问答推荐

如何使用PySide6创建切换框架?

将f-字符串放置在f-字符串内

我不能使用拆分来分隔数据

新行是pandas数据帧中旧行的组合

如何强调您正在寻求以 pandas 数据帧的另一列为条件的差异?

tkinter treeview 如何在获取所选项目时将设置的对象作为对象返回

Python - 根据条件附加 NULL 值

通过在不重新索引的情况下采用最高概率的百分比,有效地转换 0/1 列表中的概率列表

为什么不能用格式字符串 '-' 绘制点?

提取图像中的背景并保存

将自动文本转换为 DataFrame

Pandas 窗口聚合两个排序表

将两列合并为一列,将它们制成字典 - pandas - groupby

在不使用字符串方法的情况下查找字符串最后一个单词的长度 - Python

使用带有多线程的 win32com

python 3.4版不支持'ur'前缀

带百分号的 Python 字符串格式

try 在 Windows 10 高 DPI 显示器上解决模糊的 tkinter 文本 + zoom ,但担心我的方法不是 Pythonic 或不安全

TypeError:多个基地有实例布局冲突

Python:如何在 Windows 资源管理器中打开文件夹(Python 3.6.2、Windows 10)