【问题标题】:Object orientated function parameter to alter variables面向对象的函数参数来改变变量
【发布时间】:2016-12-27 19:58:50
【问题描述】:

我正在尝试将我的程序转换为面向对象的样式。目前,我有一个 brandSelector() 函数,它接受查询输入并找到查询和品牌数组之间的交集。但是,我正在尝试将 brandSelector() 转换为通用 Selector() 或交集查找器。例如,我可以使用类型和查询 (Selector(type, query)) 调用。在这种情况下,您将键入 Selector(brand, query)。该附加参数定义检查哪个数组以及设置哪个变量——或者,一个 if 语句就足够了——但我不确定如何实现这样的系统。我将不胜感激任何解决方案或建议。谢谢,

brands = ["apple", "android", "windows"]
brand = None

def Main():
    query = input("Enter your query: ").lower()
    brand = brandSelector(query)

def brandSelector(query):
    try:
        brand = set(brands).intersection(query.split())
        brand = ', '.join(brand)
        #Check Condition After Setting
        int_cond = confirmIntersection(brand)
        if int_cond == False:
            raise NameError("No Intersection")
        return brand
    except NameError:
        print("\nNo Intersection found between query defined brand and brands array\n")
        return brandDetectionFailure()

完整代码:https://github.com/KentCoding/phoneTroubleshooting/blob/master/phoneTroubleshooting.py Python版本:v3.5.2

我的尝试:

def Main():
    init()
    query = input("Enter your query: ").lower()
    brand = Selector(brand, brands, query)
    keywordSelection(query, brand)
def Selector(var, array, query):
    try:
        #Format Brands Query
        var = set(array).intersection(query.split())
        var = ', '.join(var)
        #Check Condition After Setting
        int_cond = confirmIntersection(var)
        if int_cond == False:
            raise NameError("No Intersection")
        return var
    except NameError:
        print("\nNo Intersection found between query defined brand and brands array\n")
        return brandDetectionFailure()

但是给出了错误: UnboundLocalError: local variable 'brand' referenced before assignment

【问题讨论】:

  • 该错误是因为brand = Selector(brand, brands, query) 语句在定义之前尝试通过将brand 作为参数传递给Selector() 函数来使用它。
  • 当然,这不会是一个问题,因为我用brands = ["apple", "android", "windows"] brand = None 将它定义为一个全局但是,如果这不起作用,我该如何解决它?感谢您的帮助
  • 传奇 - 谢谢! :-) 如果您将其作为答案,如果您想要代表点数,我很乐意给它打勾。

标签: python function oop parameters


【解决方案1】:

据我所知,没有理由将名为 var 的参数传递给 Selector(),因此只需将其设为 def Selector(array, query): 并使用 brand = Selector(brands, query) 调用它。

【讨论】:

  • 不客气。顺便说一句,在main() 函数内部brand 被认为是一个局部变量,因为它被分配了一个值(调用Selector() 的结果)并且在函数中的该点之前没有前面的global brand 语句。跨度>
  • 感谢您的提示 :-)
  • IMO 这不仅仅是一个“提示”,因为重要的是要了解 Python 正在执行您的def,然后才会执行此操作生成的字节码。这意味着当它遇到Selector(brand, brands, query) 调用时,它所知道的只是变量brand 没有被声明为global(所以它必须是本地的)并且没有被绑定到[i.e.已分配] 一个值。
  • 这是否意味着您不能简单地在任何函数之外定义一个全局变量?所以,你必须在函数内引用全局吗?如果是这样,怎么做?谢谢
  • 另外,作为 Python 专家,您不会知道是否可以使用变量分配数组来打印数组的变量名,例如:brands = ["apple", "android", "windows"] 在这种情况下打印'brands' 而不是'["apple", "android", "windows"]' 谢谢,
猜你喜欢
  • 2021-07-17
  • 2022-06-20
  • 1970-01-01
  • 2021-12-11
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
相关资源
最近更新 更多