【问题标题】:Retrieving the code inside a 'with' statement在“with”语句中检索代码
【发布时间】:2019-09-17 21:35:53
【问题描述】:

解决这个问题 我显然根本没有很好地解释,而且似乎没有一个答案符合我的想法。


在下面显示的示例中,我试图创建一个更简洁的循环,最终看起来像l(n)l*n 或类似的东西。

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

但是,想法是循环显示的代码(在本例中为pass)。如何用 with 语句中编写的代码替换 print("hello")?是否可以?我想这不是应该使用 with 语句的用途,所以有替代方案吗?

class loop:
    def __init__(self, loops):
        self.loops = loops
    def __enter__(self):
        for x in range(self.loops):
            print("hello")
    def __exit__(self, *args):
        pass

    
with loop(5):
    pass

编辑: 这是编辑后的代码,因为我认为我没有足够清楚地说明我想要做什么:

class loop:
    def __init__(self, loops):
        self.loops = loops
    def __enter__(self):
        pass
    def __exit__(self, *args):
        pass

    
with loop(5):
    print("This will loop 5 times")

with loop(10):
    print("This will loop 10 times")

所以在程序的任何时候,我都可以简单地用任何代码键入底部的两行,它就可以工作了。我可以完成这项工作吗?

【问题讨论】:

  • 为什么不for _ in range(5):
  • 覆盖 __nonzero__ 并执行 while loop(5):

标签: python class with-statement


【解决方案1】:

如果你只想要一个简洁的循环,我会完全避免创建一个类。

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


loop(5)

【讨论】:

    【解决方案2】:

    我认为您不能循环遍历 with 块内的代码。 最接近的方法是将 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
    

    虽然在这种情况下你根本不需要with

    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()
    

    【讨论】:

    • 您能详细说明一下答案吗?这只是提供了一个解决方案,但并不能真正帮助用户理解它的工作原理。
    • 我会拒绝我在代码审查中看到的任何这样的代码。
    • @Enthus3d 这只是问题中提供的稍微修改的代码。从我的角度来看,它非常简单,不需要任何解释。你认为它需要解释,随意修改答案,stackoverflow 允许这样做,我认为甚至鼓励。
    • @chepner 我也会在审查中阻止此类代码(但不是“拒绝”,因为它意味着不同的东西)。虽然我认为问题是关于如何将函数作为第一类对象传递给 loop 以进行学习。
    • 不,问题是如何从上下文管理器访问with 块的主体(您不能这样做)。这是一种解决方法,但这并不意味着应该编写这样的代码。
    【解决方案3】:

    不要使用循环。

    定义循环(n): 对于范围内的_(n): 打印(“你好”)

    循环(5)

    那么这将打印“Hello” 5 次。

    【讨论】:

    • 有没有办法更“动态”地做到这一点,例如一个可以导入的模块?定义一个函数会破坏减少编写代码量的意义。
    • for _ in range(n):
    • 打印(“你好”)
    • @Doot 你的with l(n): 只会比for _ in range(5) 节省8 个字符,忽略你必须首先写给define l 的代码。 Python 已经提供了一种简洁、明显的方式来做你想做的事。
    • 听切普纳的歌^^^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2021-08-22
    • 2018-12-06
    相关资源
    最近更新 更多