如何从另一个方法正确调用一个方法
How to properly call one method from another method
如何在 python 中正确地从一个方法调用另一个方法。
在我想对这些数据进行排序并将其写入 .txt 后,我从 AWS S3 存储桶中获取了一些数据。
import boto3
import string
import json
import collections
def handler(event, context):
print(f'Event: {event}')
s3 = boto3.resource('s3')
bucket = s3.Bucket(event["bucket"])
for obj in bucket.objects.all():
key = obj.key
body = obj.get()['Body'].read()
b = json.loads(body)
c = WordCorrection.create_duplicated_words_file(b)
# WordCorrection.create_duplicated_words_file(WordCorrection.word_frequency(
# WordCorrection.correct_words(b)))
# WordCorrection.spell_words(WordCorrection.dict_spell_words(WordCorrection.unrecognized_words_from_textrtact(b)))
return c
CONFIDENT_LEVEL = 98
class WordCorrection:
def correct_words(data):
spell = SpellChecker()
correct_words_from_amazon = []
for items in data['Blocks']:
if items['BlockType'] == "WORD" and items['Confidence'] > CONFIDENT_LEVEL and {items["Text"]} != spell.known([items['Text']]):
correct_words_from_amazon.append(items['Text'])
correct_words_from_amazon = [''.join(c for c in s if c not in string.punctuation) for s in
correct_words_from_amazon]
return correct_words_from_amazon
def word_frequency(self, correct_words_from_amazon):
word_counts = collections.Counter(correct_words_from_amazon)
word_frequency = {}
for word, count in sorted(word_counts.items()):
word_frequency.update({word: count})
return dict(sorted(word_frequency.items(), key=lambda item: item[1], reverse=True))
def create_duplicated_words_file(word_frequency):
with open("word_frequency.txt", "w") as filehandle:
filehandle.write(str(' '.join(word_frequency)))
我试图使用 self
但我看不到好的结果,并且出于我使用
的原因
WordCorrection.create_duplicated_words_file(WordCorrection.word_frequency(WordCorrection.correct_words(b)))
但我 100% 确定它不正确,还有另一种方法可以从另一个方法调用一个方法吗?
我认为你的问题是对 keywords/namespaces 模块与 classes 的误解造成的。
模块:
在 python、files are modules 中,因此当您在文件内部时,文件中到该点为止定义的所有函数都在“范围内”。所以如果我有两个这样的函数:
def func_foo():
return "foo"
def func_bar():
return func_foo() + "bar"
然后 func_bar()
将 return "foobar"
.
类
当您使用 class
关键字定义 class 时,它会定义一个新的 scope/namespace。使用单词 self
作为实例方法的第一个参数被认为是正确的(尽管在技术上不是必需的),这指的是调用该方法的实例。
例如:
class my_clazz:
def method_foo(self):
return "foo"
def method_bar(self):
return self.method_foo() + "bar"
然后如果我稍后在文件中:
example = my_clazz()
ret_val = example.method_bar()
ret_val
将是 "foobar"
也就是说,因为我在这个例子中并没有真正利用 object-oriented 编程功能,所以 class 定义在很大程度上是不必要的。
你的问题
所以对于你的问题,你的麻烦似乎是由似乎不必要地将你的函数包装在 class 定义中引起的。如果你摆脱了 class 定义 header 并且只是在模块中创建你的所有函数,你将能够使用我上面使用的调用技术。有关 Python 中 classes 的更多信息,我建议阅读 here。
如何在 python 中正确地从一个方法调用另一个方法。 在我想对这些数据进行排序并将其写入 .txt 后,我从 AWS S3 存储桶中获取了一些数据。
import boto3
import string
import json
import collections
def handler(event, context):
print(f'Event: {event}')
s3 = boto3.resource('s3')
bucket = s3.Bucket(event["bucket"])
for obj in bucket.objects.all():
key = obj.key
body = obj.get()['Body'].read()
b = json.loads(body)
c = WordCorrection.create_duplicated_words_file(b)
# WordCorrection.create_duplicated_words_file(WordCorrection.word_frequency(
# WordCorrection.correct_words(b)))
# WordCorrection.spell_words(WordCorrection.dict_spell_words(WordCorrection.unrecognized_words_from_textrtact(b)))
return c
CONFIDENT_LEVEL = 98
class WordCorrection:
def correct_words(data):
spell = SpellChecker()
correct_words_from_amazon = []
for items in data['Blocks']:
if items['BlockType'] == "WORD" and items['Confidence'] > CONFIDENT_LEVEL and {items["Text"]} != spell.known([items['Text']]):
correct_words_from_amazon.append(items['Text'])
correct_words_from_amazon = [''.join(c for c in s if c not in string.punctuation) for s in
correct_words_from_amazon]
return correct_words_from_amazon
def word_frequency(self, correct_words_from_amazon):
word_counts = collections.Counter(correct_words_from_amazon)
word_frequency = {}
for word, count in sorted(word_counts.items()):
word_frequency.update({word: count})
return dict(sorted(word_frequency.items(), key=lambda item: item[1], reverse=True))
def create_duplicated_words_file(word_frequency):
with open("word_frequency.txt", "w") as filehandle:
filehandle.write(str(' '.join(word_frequency)))
我试图使用 self
但我看不到好的结果,并且出于我使用
WordCorrection.create_duplicated_words_file(WordCorrection.word_frequency(WordCorrection.correct_words(b)))
但我 100% 确定它不正确,还有另一种方法可以从另一个方法调用一个方法吗?
我认为你的问题是对 keywords/namespaces 模块与 classes 的误解造成的。
模块:
在 python、files are modules 中,因此当您在文件内部时,文件中到该点为止定义的所有函数都在“范围内”。所以如果我有两个这样的函数:
def func_foo():
return "foo"
def func_bar():
return func_foo() + "bar"
然后 func_bar()
将 return "foobar"
.
类
当您使用 class
关键字定义 class 时,它会定义一个新的 scope/namespace。使用单词 self
作为实例方法的第一个参数被认为是正确的(尽管在技术上不是必需的),这指的是调用该方法的实例。
例如:
class my_clazz:
def method_foo(self):
return "foo"
def method_bar(self):
return self.method_foo() + "bar"
然后如果我稍后在文件中:
example = my_clazz()
ret_val = example.method_bar()
ret_val
将是 "foobar"
也就是说,因为我在这个例子中并没有真正利用 object-oriented 编程功能,所以 class 定义在很大程度上是不必要的。
你的问题
所以对于你的问题,你的麻烦似乎是由似乎不必要地将你的函数包装在 class 定义中引起的。如果你摆脱了 class 定义 header 并且只是在模块中创建你的所有函数,你将能够使用我上面使用的调用技术。有关 Python 中 classes 的更多信息,我建议阅读 here。