【问题标题】:Using a returned value from one class function to another [Python]使用一个类函数的返回值到另一个 [Python]
【发布时间】:2021-11-02 15:28:19
【问题描述】:

我正在使用 Python NLTK 进行一个项目,并且遇到了一些问题,即 joiner() 函数无法从同一类中的另一个函数(名为 open_file())检索返回值。想知道 return 函数在这种情况下应该如何工作以及如何解决这个问题。谢谢大家!

代码:

import nltk

nltk.download('wordnet')
from nltk.corpus import wordnet as wn


class Sentence:

    def open_file(self):
        file_vals = []
        i = 0
        with open("words.txt", "r") as my_file:
            for line in my_file:
                if i < 20:
                    stripped_line = line.strip()
                    file_vals.append(stripped_line)
                    i += 1
                else:
                    print(file_vals)
                    return file_vals

    def joiner(self, file_vals):
        val_1 = wn.synsets(file_vals[0])[0].pos()
        val_2 = wn.synsets(file_vals[1])[0].pos()

        if val_1 == "n" and val_2 == "v":
            print(val_1.capitalize() + " " + val_2 + ".")


my_obj = Sentence()
my_obj.open_file()
my_obj.joiner()

【问题讨论】:

    标签: python return nltk


    【解决方案1】:

    请注意,您没有包含错误消息。 但是,您的代码的明显问题是类中定义的方法在类被实例化并调用该方法之前不会执行。这就是为什么您不能在未实例化的类中将值从一种方法传递给另一种方法的原因。实现我认为您想要做的事情的一种方法是: 这是假设您的代码的所有其他部分不包含错误。另外,我没有尝试运行您的代码。

    import nltk
    
    nltk.download('wordnet')
    from nltk.corpus import wordnet as wn
    
    
    class Sentence:
    
        def open_file(self):
            file_vals = []
            i = 0
            with open("words.txt", "r") as my_file:
                for line in my_file:
                    if i < 20:
                        stripped_line = line.strip()
                        file_vals.append(stripped_line)
                        i += 1
                    else:
                        print(file_vals)
                        return file_vals
    
        def joiner(self, file_vals):
            val_1 = wn.synsets(file_vals[0])[0].pos()
            val_2 = wn.synsets(file_vals[1])[0].pos()
    
            if val_1 == "n" and val_2 == "v":
                print(val_1.capitalize() + " " + val_2 + ".")
    
    my_obj = Sentence()
    file_vals = my_obj.open_file()
    my_obj.joiner(file_vals)
    

    您必须先保存“open_file”方法返回的值,然后将返回的值作为参数传递给“joiner”。

    【讨论】:

    • 是的,错误消息如下:“TypeError: joiner() missing 1 required positional argument: 'file_vals'”。我尝试运行解决方案代码,不幸的是发生了同样的问题。
    • 我猜这是因为 ``` file_vals``` 的名称与函数定义中的名称相同。这应该有效:``` my_obj = Sentence() file_values = my_obj.open_file() my_obj.joiner(file_values) ```
    【解决方案2】:

    您调用joiner() 函数的方式不正确。由于你定义的open_file()函数返回变量file_valsjoiner()函数需要file_vals作为它的参数,所以你应该将open_file()函数的返回结果传递给joiner()函数,例如:

    my_obj = Sentence()
    my_obj.joiner(my_obj.open_file())
    

    【讨论】:

    • 谢谢,这似乎解决了退货问题。似乎我仍然对 val_2 有问题,即“IndexError:list index out of range”,对此有什么想法吗?
    • 应该是因为file_vals[1]。在某些情况下,file_vals 的索引 1 没有值。
    • 奇怪的是,打印的列表在索引 0 和 1 处都显示了一个值,一直到 19,仍然不完全确定为什么会抛出超出范围的错误。
    猜你喜欢
    • 2017-06-30
    • 2021-12-16
    • 2013-12-06
    • 2015-07-16
    • 2020-03-27
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多