Принятие хеша фиксации, которую Вы хотите, c5f567
:
git checkout c5f567 -- file1/to/restore file2/to/restore
контроль мерзавца страница справочника дает больше информации.
, Если Вы хотите вернуться к фиксации прежде c5f567
, добавьте ~1
(работы с любым числом):
git checkout c5f567~1 -- file1/to/restore file2/to/restore
Как примечание стороны, я всегда чувствовал себя неловко из-за этой команды, потому что она используется для обеих обычных вещей (изменяющийся между ответвлениями) и необычных, разрушительных вещей (отменяющий изменения в рабочем каталоге).
Вы довольно близки к этому - просто не хватает нового
модуля:
import inspect
import new
def f():
x, y = 1, 2
def get():
print 'get'
def post():
print 'post'
for c in f.func_code.co_consts:
if inspect.iscode(c):
f = new.function(c, globals())
print f # Here you have your function :].
Но какого черта? Разве не проще использовать класс? В любом случае создание экземпляров выглядит как вызов функции.
Вы можете возвращать функции точно так же, как любой другой объект в Python:
def f():
x, y = 1, 2
def get():
print 'get'
def post():
print 'post'
return (get, post)
get, post = f()
Надеюсь, это поможет!
Однако обратите внимание, что если вы хотите использовать свои 'x' и 'y' переменные в get () или post (), вы должны составить их список.
Если вы сделаете что-то вроде этого:
def f():
x = [1]
def get():
print 'get', x[0]
x[0] -= 1
def post():
print 'post', x[0]
x[0] += 1
return (get, post)
get1, post1 = f()
get2, post2 = f()
get1 и post1 будут ссылаться на другой список 'x', чем get2 и post2.
Внутренние объекты функции не существуют до выполнения функции f (). Если вы хотите их получить, вам придется построить их самостоятельно. Это определенно нетривиально, потому что они могут быть замыканиями, которые захватывают переменные из области действия функции и в любом случае потребуют ковыряния в объектах, которые, вероятно, следует рассматривать как детали реализации интерпретатора.
Если вы хотите собрать функции с меньшим количеством повторений я рекомендую один из следующих подходов:
a) Просто поместите функции в определение класса и верните ссылку на этот класс. Набор связанных функций, доступ к которым осуществляется по имени, ужасно пахнет классом.
б) Создайте подкласс dict, у которого есть метод для регистрации функций, и используйте его в качестве декоратора.
Код для этого будет выглядеть примерно так:
class FunctionCollector(dict):
def register(self, func):
self[func.__name__] = func
def f():
funcs = FunctionCollector()
@funcs.register
def get():
return 'get'
@funcs.register
def put():
return 'put'
return funcs
c) Покопайтесь в locals () и отфильтруйте функцию с помощью inspect.isfunction. (обычно не очень хорошая идея)
Вы можете использовать exec для запуска объектов кода. Например, если вы определили f, как указано выше, то
exec(f.func_code.co_consts[3])
выдаст
get
в качестве вывода.