Python 检索“with”语句中的代码

Python 检索“with”语句中的代码,python,class,with-statement,Python,Class,With Statement,关于这个问题 很明显,我一点也没解释清楚,而且所有的答案似乎都不是关于我心中所想的主题 在下面的示例中,我试图创建一个更简洁的循环,在这个循环中,它最终将看起来像ln、l*n或类似的东西 在所示的示例中,代码将打印hello 5次或我设置的任何次数,然后在with循环中执行代码,这并非意外 然而,在本例中,这个想法是代码通过的循环。如何用with语句中编写的代码替换printhello?可能吗?我想这不是with语句应该用来做的,那么还有其他选择吗 类循环: def u_init__self,循

关于这个问题 很明显,我一点也没解释清楚,而且所有的答案似乎都不是关于我心中所想的主题

在下面的示例中,我试图创建一个更简洁的循环,在这个循环中,它最终将看起来像ln、l*n或类似的东西

在所示的示例中,代码将打印hello 5次或我设置的任何次数,然后在with循环中执行代码,这并非意外

然而,在本例中,这个想法是代码通过的循环。如何用with语句中编写的代码替换printhello?可能吗?我想这不是with语句应该用来做的,那么还有其他选择吗

类循环: def u_init__self,循环: self.loops=循环 定义u_输入_self: 对于rangeself.loops中的x: 你好 def u_退出_self,*参数: 通过 第5条: 通过 编辑: 以下是经过编辑的代码,因为我认为我没有足够清楚地说明我要做的事情:

类循环: def u_init__self,循环: self.loops=循环 定义u_输入_self: 通过 def u_退出_self,*参数: 通过 第5条: 打印这将循环5次 第10条: 打印这将循环10次
因此,在程序中的任何时候,我都可以用任何代码简单地键入底部的两行,这样就可以工作了。我能做到这一点吗?

我认为你不能用block循环遍历代码。 最接近的方法是将lambda作为第二个参数传递

class loop:
    def __init__(self, loops, action):
        self._loops = loops
        self._action = action
    def __enter__(self):
        for x in range(self._loops):
            self._action()
    def __exit__(self, *args):
        pass

def f():
    print("hello")

with loop(5, f):
    pass
尽管在这种情况下,您根本不需要:

def loop(n, f):
    for _ in range(n):
            f()

def my_printer():
    print("hello")

loop(5, my_printer)
另外,我将避免为循环创建自己的方法,该语言已经内置了创建循环的语法,只需直接使用它:

def my_printer():
    print("hello")

for _ in range(5):
    my_printer()

如果您只需要一个简洁的循环,我将完全避免创建类

def loop(n):
    for _ in range(n):
        print("Hello")
        # Or whatever you want


loop(5)
不要使用循环

def loopn:
对于uu in rangen: 你好

回路5


然后,这将打印Hello 5次。

为什么不在范围5内打印?覆盖非零并执行while loop5:您可以详细说明答案吗?这只是提供了一个解决方案,但并不能真正帮助用户理解它的工作原理。我会拒绝我在代码评审中看到的任何类似的代码。@Enthus3d它只是问题中提供的稍加修改的代码。从我的角度来看,这是非常简单的,不需要任何解释。你认为它需要解释,请随意修改答案,stackoverflow允许这样做,我甚至认为这是鼓励。@chepner我也会在审查中阻止这样的代码,但不会拒绝,因为它意味着不同的东西。虽然我相信问题是关于如何将函数作为第一类对象传递到循环中进行学习。不,问题是如何从上下文管理器访问with块的主体,这是您无法做到的。这是一种变通方法,但这并不意味着应该编写这样的代码。是否有一种方法可以更“动态”地执行此操作,例如,您可以导入一个允许这样做的模块?定义函数无法减少编写的代码量。对于u in rangen:print Hello@Doot Your with ln:将只为u in range5保存8个字符,而忽略您在定义l时首先必须编写的代码。Python已经提供了一种简洁明了的方法来做你想做的事情^^^