2016-07-29 28 views
9

Ich versuche ein kleines Skript zu schreiben, das einige PHP-Boilerplates automatisiert, die ich schreiben muss. Es sollte eine Kopie der Zeichenfolge code in die Ausgabedatei schreiben, wobei die verschiedenen Ersatzfelder für jedes dict in der Liste fields ausgefüllt werden.Unerwarteter '{' in Feldname beim Formatieren von Strings

Allerdings erhalte ich die Fehlermeldung:

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

Soweit ich sagen kann, es gibt keine zusätzlichen Klammern in entweder den Ersatz Felder oder die dicts, die Probleme verursachen, sollten, so dass jede Hilfe würde geschätzt werden.

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') 

Antwort

14

Sie müssen Doppel jede { oder }, die nicht Teil einer Formatierung Platzhalter sind. Zum Beispiel haben Sie:

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

in der Zeichenfolge. Die { und } dort sind nicht Teil eines Platzhalters.

Verdoppelung dieser geschweiften Klammern entgeht ihnen; Die endgültige Ausgabe enthält die Zeichen { und } erneut: