В настоящее время я делаю свое первое усилие python, модификацию некоторого кода, написанного другом. Я использую python 2.6.6. Исходный фрагмент кода, который работает, извлекает информацию из файла журнала данных из пожертвований, сделанных с помощью кредитной карты, моей некоммерческой организации. Моя новая версия, если она будет работать в один прекрасный день, выполнит ту же задачу для пожертвований, которые были сделаны paypal. Файлы журнала похожи, но имеют разные имена полей и другие отличия.mysterious "'str' объект не вызываем" ошибка python
Сообщения об ошибках я получаю это:
Traceback (самый последний вызов последнего): Файл "../logparse-paypal-1.py", строка 196, в convert_log (sys.argv [1], sys.argv [2], access_ids) Файл «../logparse-paypal-1.py», строка 170, в convert_log output = [f (запись, access_ids) для f в output_fns ] ТипError: объект 'str' не является вызываемым
Я читал некоторые сообщения на этом форуме, связанные с этой ошибкой сообщение, но до сих пор я все еще в море. Я не могу найти каких-либо косвенных различий между частями моего кода, связанными с вероятным объектом проблемы (access_ids) и кодом, с которого я начал работать. Все, что я делал, связанное с таблицей access_ids, заключалось в том, чтобы удалить некоторые строки, которые печатали проблемы, найденные сценарием, с таблицей, которая заставила его игнорировать некоторые данные. Возможно, я изменил характер или что-то еще, делая это, но я посмотрел и до сих пор ничего не могу найти.
Часть кода, который производит эти сообщения об ошибках заключается в следующем:
# Use the output functions configured above to convert the
# transaction record into a list of outputs to be emitted to
# the CSV output file.
print "Converting %s at %s to CSV" % (record["type"], record["time"])
output = [f(record, access_ids) for f in output_fns]
j = 0
while j < len(output):
os.write(csv_fd, output[j])
if j < len(output) - 1:
os.write(csv_fd, ",")
else:
os.write(csv_fd, "\n")
j += 1
convert_count += 1
print "Converted %d approved transactions to CSV format, skipped %d non-approved transactions" % (convert_count, skip_count)
if __name__ == '__main__':
if len(sys.argv) < 3:
print "Usage: logparse.py INPUT_FILE OUTPUT_FILE [ACCESS_IDS_FILE]"
print
print " INPUT_FILE Silent post log containing transaction records (must exist)"
print " OUTPUT_FILE Filename for the CSV file to be created (must not exist, will be created)"
print " ACCESS_IDS_FILE List of Access IDs and email addresses (optional, must exist if specified)"
sys.exit(-1)
access_ids = {}
if len(sys.argv) > 3:
access_ids = load_access_ids(sys.argv[3])
convert_log(sys.argv[1], sys.argv[2], access_ids)
Линия 170 это: выход = [F (запись, access_ids) для F в output_fns]
и линия 196 это одно: convert_log (sys.argv [1], sys.argv [2], access_ids)
определение access_ids, поз Сибли связана с проблемой, заключается в следующем:
def access_id_fn(record, access_ids):
if "payer_email" in record and len(record["payer_email"]) > 0:
if record["payer_email"] in access_ids:
return '"' + access_ids[record["payer_email"]] + '"'
else:
return ""
else:
return ""
И
def load_access_ids(filename):
print "Loading Access IDs from %s..." % filename
access_ids = {}
for line in open(filename, "r"):
line = line.rstrip()
access_id, email = [s.strip() for s in line.split(None, 1)]
if not email_address.match(email):
continue
if email in access_ids:
access_ids[string.strip(email)] = string.strip(access_id)
return access_ids
Заранее спасибо за любые советы с этим.
- Dave
Можете ли вы опубликовать тестовую программу [* complete *] (http://sscce.org/#selfcon), которая показывает проблему? Скорее всего, значение 'output_fn' является проблемой. – phihag
Я думаю, что проблема заключается в том, что output_fns - это список строк.Таким образом, в контексте инструкции по пониманию списка f() не является функцией, а является строкой. Попробуйте добавить следующий оператор печати непосредственно перед строкой 170 «print»% s '% output_fns » – user590028
@ user590028, я добавил эту строку. Вот сообщение, которое я получить сейчас: Файл «../logparse-paypal-1.py», строка 170, в convert_log печати „% S“% output_fns TypeError: не все аргументы преобразуются во строки форматирования –