【问题标题】:Is it possible to reference a variable for an if statement that may or may not yet be defined?是否可以为可能定义或尚未定义的 if 语句引用变量​​?
【发布时间】:2021-03-24 05:57:04
【问题描述】:

尝试编写API交易算法-我需要检查订单是否已成交,如果已成交,则下新订单,如果订单尚未成交或没有订单,则什么都不做(返回)。仅在有未结订单时才声明包含“已成交”或“未成交”的变量。如果变量为“已填充”,我希望它基本上发送订单,如果变量未定义,我也发送订单,但如果未填写且未定义,则不发送订单(从未发送过订单,即初始运行) ...

原来的问题是即使前一个订单还没有成交,它也会发送第二个订单,所以我在'openOrders'函数中创建了一个显示订单状态的变量。但如果没有订单,则变量未定义。所以我希望它在未定义(无订单)的情况下发送订单,如果变量为“已填充”,则发送订单。

我有这段代码,但第一行把它扔掉了,因为它没有将任何代码识别为未定义。有什么建议吗?

if self.openOrderStatus == None:  #<--                           
      # SELL

elif self.openOrderStatus != 'Filled':
      return
else:
      # SELL

【问题讨论】:

  • 您不应该编写代码,其中可能会或可能不会根据某些条件定义变量。这是XY problem
  • 不,你不能。但是我不同意@kaya3,处理此问题的“pythonic”方法是将if 放入try/except 并优雅地处理任何NameError 异常。另一种(非pythonic)方法是使用getattr() 在尝试访问它之前检查它是否存在。
  • 这里最明显的解决方案是在创建包含它的实例时将self.openOrderStatus 初始化为None。有什么理由你不能这样做吗?
  • ...也就是说,如果你让你的__init__(self):包含self.openOrderStatus = None,异常就变得不可能了。
  • 为正常的控制流处理NameError,对不起,这不是一件明智的事情。如果你这样做,那么如果你打错了,你的程序就会做一些奇怪和意想不到的事情,而不是给你一个有用的错误信息。 NameError 应该意味着您的程序编写不正确。

标签: python


【解决方案1】:

在创建包含对象时,只需给openOrderStatus 一个初始值None。那代表一个不存在的订单。然后您向我们展示的代码将按原样工作。例如:

class SomeClass:

    def __init__(self):
        self.openOrderStatus = None
        ...

    def some_method(self):

        if self.openOrderStatus == None:  # <-- no throw now
            # SELL
            ...
        elif self.openOrderStatus != 'Filled':
            return
        else:
            # SELL
            ...

【讨论】:

    【解决方案2】:

    如果您想将不存在的属性强制转换为 None,一个简单的方法是使用 getattr() 并填写默认值:

    if getattr(self, 'openOrderStatus', None) == None:  #<--                           
          pass # SELL
    elif getattr(self, 'openOrderStatus', None) != 'Filled':
          return
    else:
          pass # SELL
    

    但是,最好的做法是初始化您的对象,使您想要的每个属性始终都有一个值,即使该值是None

    【讨论】:

      猜你喜欢
      • 2017-03-21
      • 2020-08-31
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 2020-04-25
      • 2013-10-19
      • 2020-02-27
      • 1970-01-01
      相关资源
      最近更新 更多