Анализирование заданной функции вложило (локальные) функции в Python

Принятие хеша фиксации, которую Вы хотите, c5f567:

git checkout c5f567 -- file1/to/restore file2/to/restore

контроль мерзавца страница справочника дает больше информации.

, Если Вы хотите вернуться к фиксации прежде c5f567, добавьте ~1 (работы с любым числом):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

Как примечание стороны, я всегда чувствовал себя неловко из-за этой команды, потому что она используется для обеих обычных вещей (изменяющийся между ответвлениями) и необычных, разрушительных вещей (отменяющий изменения в рабочем каталоге).

5
задан Will McCutchen 5 August 2009 в 17:36
поделиться

4 ответа

Вы довольно близки к этому - просто не хватает нового модуля:

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 :].

Но какого черта? Разве не проще использовать класс? В любом случае создание экземпляров выглядит как вызов функции.

4
ответ дан 14 December 2019 в 01:13
поделиться

Вы можете возвращать функции точно так же, как любой другой объект в 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.

2
ответ дан 14 December 2019 в 01:13
поделиться

Внутренние объекты функции не существуют до выполнения функции 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. (обычно не очень хорошая идея)

1
ответ дан 14 December 2019 в 01:13
поделиться

Вы можете использовать exec для запуска объектов кода. Например, если вы определили f, как указано выше, то

exec(f.func_code.co_consts[3])

выдаст

get

в качестве вывода.

2
ответ дан 14 December 2019 в 01:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: