2013-12-11 2 views
1

Я пишу программу, которая будет запускать много выходных данных печати. Все, что я действительно хочу сделать, это некоторые части этого вывода на печать, написанные непосредственно в моей программе после закрытия.Python: программа, которая сама меняет

Подумайте, как если бы были «сохранить()» Функцию подобия «печати()», который будет работать так:

string = "#this my generated comment" 
save(string,line) 

линия, конечно, будет строки, в которой вы хотите строку сохраненный в программе. Теперь, имея в виду, я просто не хочу ограничиваться добавлением комментариев, я бы хотел, чтобы код, который будет выполняться в следующий раз, когда вызывается новая строка.

Если единственный способ сделать это - сохранить файл, отредактировать его, а затем перезагрузить, это нормально. Базовая прогулка будет оценена,

Редактировать: В качестве альтернативы я не против идеи сохранения добавленной строки в другой файл, а затем импортирования ее из программы.

спасибо,

+2

Я действительно не рекомендую вам делать это вообще. a) Это требует, чтобы вы каким-то образом проанализировали свой модуль. b) Он требует специальных знаний о внутренних компонентах Python. c) Плохая практика хранения данных в исходном коде. Используйте базу данных, файл JSON/Pickled, CSV, что угодно. –

+0

добавлено для редактирования: как сохранить его в другой файл, а затем импортировать его из программы, чтобы добавить его? –

+0

@NickSimas Вы смешиваете данные и код. – Hyperboreus

ответ

1

комментаторами, заявляющие, что это плохая форма/плохая практика, чтобы изменить программу питона на лету возможно, очень ошибочны. Это одна из основных особенностей python, которую я лично использовал во многих случаях (как студент CS grad, работающий над теорией PL). Однако они правильны, что это плохая форма для метапрограммирования с использованием строк типа «x = x + 1». Если вы хотите изменить работу своей программы на лету, вы должны использовать type function. Также обратите внимание на следующий учебник по мета-программирование в Python:

http://python-3-patterns-idioms-test.readthedocs.org/en/latest/Metaprogramming.html

Если вам действительно нужно сохранить экземпляр одного из ваших классов по прогонов программы, то вы бы использовать pickle library как Джеймс Миллс указал в своем ответе.Это так же просто, как:

#!/usr/bin/python 

class HelloWorld: 

    def __init__(self, string): 
    self.string = string 

    def run(self): 
    print self.string 

import pickle 
pickle.dump(HelloWorld, open("prog.pkl", 'w')) 
HW = pickle.load(open("prog.pkl", 'r')) 
x = HW("Hello World") 
x.run() 

Edit: Для того, чтобы иметь «код, который будет выполняться в следующий раз, что называется новая линия» вы не хотите использовать inspect.getsource(), вместо этого вы должны (после кода выше) :

import types 
def newfncn(self): 
    print self.string + " 2.0!" 
x.run = types.MethodType(newfncn, x) 
x.run() 

Если вы действительно необходимо использовать строки для редактирования кода, вы можете сделать что-то вроде:

import types 
def newfncn(self): 
    exec("print self.string + \" 2.0!\"") 
x.run = types.MethodType(newfncn, x) 
x.run() 

Что я очень советую Агаи НСТ.

+0

IHMO op не говорил о ** мета-программировании **. Вопрос был сосредоточен на сохранении ** Пользовательских данных **. Однако я согласен с вами в том, что я сделал много ** метапрограмм **, как показано в моей структуре приложений схем. Python обладает очень мощными возможностями метапрограммирования, которые при правильном использовании очень полезны. –

+0

Мне нравится, когда вы собираетесь с этим, но я не совсем понимаю. Чтобы обеспечить контекст: я пытаюсь вытащить функцию из функции inspect.getsource(). Да, я хочу сохраненную версию функции, но в идеале я хотел бы, чтобы программа могла работать, как я описал «код, который будет выполняться в следующий раз, когда будет вызываться новая строка». Есть и другие способы сделать это, но я не могу понять, как это сделать с помощью функции inspect.getsource() без изменения фактического файла программы. –

+0

см. Также (первая половина лестницы) мой предыдущий вопрос: http://stackoverflow.com/questions/20510020/python-literally-printing-a-function –

3

Вместо того, чтобы пытаться изменить исходный код работы вашего модуля/программы рассмотреть любую из следующих действий:

  • записать данные в файл сериализации JSON/Рассол.
  • Напишите свои данные в файл CSV.
  • Использование SQLite (поставляется с большинством дистрибутивов Python)
  • Используйте любой другой вид реальной базы данных.

Некоторые полезные ссылки:

+0

В этом случае сама суть этой программы зависит от выполнения этой операции. Это может быть сложно и, возможно, неортодоксально, но это необходимо. –

+0

Возможно, есть способ добавить исходный код? Просто возможность добавить в будет решить проблему. –

+0

Если вы хотите сохранить «Данные пользователя», это все равно не очень хорошая идея. Гораздо лучше использовать «какое-то хранилище данных». –

Смежные вопросы