What I want to do is:
property = "name"
formatter = "my %s is %s" % property
print formatter % "wong2" // "my name is wong2"
but the first line gives "not enough arguments for format string" error.
You can escape a formatter by doubling it
formatter = "my %s is %%s" % property
You can also do all substitutions at the same time using by-name instead of positional formatting:
formatter = "my %(property)s is %(name)s"
print formatter % { "property": "name",
"name": "wong2" }
This forms allows for a variable number of substitutions (i.e. not all keys in the dictionary needs to be used and they may be used more than once). This is important if for example the format string is read from a configuration file.