Почему я продолжаю получать ошибку строки 93, в которой говорится, что TwitterClient не определен, когда он определен в классе выше?

#python

#python

Вопрос:

Это для tweepy. В нем говорится

TwitterClient не определен.

 import re 
import tweepy 
from tweepy import OAuthHandler 
from textblob import TextBlob 
class TwitterClient(object):
    '''
   Generic Twitter Class for sentiment analysis. 
    '''
    def __init__(self): 
        ''' 
    Class constructor or initialization method. 
        '''
        # keys and tokens from the Twitter Dev Console 
        consumer_key = 'remove'
        consumer_secret = 'remove'
        access_token = 'remove-remove'
        access_token_secret = 'remove'

        # attempt authentication 
        try: 
        # create OAuthHandler object 
            self.auth = OAuthHandler(consumer_key, consumer_secret) 
        # set access token and secret 
            self.auth.set_access_token(access_token, access_token_secret) 
        # create tweepy API object to fetch tweets 
            self.api = tweepy.API(self.auth) 
        except: 
            print("Error: Authentication Failed") 

    def clean_tweet(self, tweet): 
        ''' 
        Utility function to clean tweet text by removing links, special characters 
        using simple regex statements. 
        '''
        return ' '.join(re.sub("(@[A-Za-z0-9] )|([^0-9A-Za-z t])|(w ://S )", " ", tweet).split())
    def get_tweet_sentiment(self, tweet): 
        ''' 
        Utility function to classify sentiment of passed tweet 
        using textblob's sentiment method 
        '''
        # create TextBlob object of passed tweet text 
        analysis = TextBlob(self.clean_tweet(tweet)) 
        # set sentiment 
        if analysis.sentiment.polarity > 0: 
            return 'positive'
        elif analysis.sentiment.polarity == 0: 
            return 'neutral'
        else: 
            return 'negative'
    def get_tweets(self, query, count = 10): 
        ''' 
        Main function to fetch tweets and parse them. 
        '''
        # empty list to store parsed tweets 
        tweets = [] 
        try: 
            # call twitter api to fetch tweets 
                fetched_tweets = self.api.search(q = query, count = count) 

            # parsing tweets one by one 
                for tweet in fetched_tweets: 
                # empty dictionary to store required params of a tweet 
                    parsed_tweet = {} 

                # saving text of tweet 
                    parsed_tweet['text'] = tweet.text 
                # saving sentiment of tweet 
                    parsed_tweet['sentiment'] = self.get_tweet_sentiment(tweet.text)
                # appending parsed tweet to tweets list 
                    if tweet.retweet_count > 0: 
                    # if tweet has retweets, ensure that it is appended only once 
                        if parsed_tweet not in tweets: 
                            tweets.append(parsed_tweet) 
                        else: 
                            tweets.append(parsed_tweet) 

                # return parsed tweets 
                return tweets 

        except tweepy.TweepError as e: 
            #print error (if any) 
                print("Error : "   str(e)) 

    def main():
            #creating object of TwitterClient Class 
        api = TwitterClient()
            #calling function to get tweets 
        tweets = api.get_tweets(query = 'ADF', count = 200) 

        #picking positive tweets from tweets 
        ptweets = [tweet for  tweet in tweets if tweet['sentiment'] == 'positive'] 
    #       percentage of positive tweets 
        print("Positive tweets percentage: {} %".format(100*len(ptweets)/len(tweets))) 
            #picking negative tweets from tweets 
        ntweets = [tweet for tweet in tweets if tweet['sentiment'] == 'negative'] 
            #percentage of negative tweets 
        print("Negative tweets percentage: {} %".format(100*len(ntweets)/len(tweets))) 
            #percentage of neutral tweets 
        netweets = [tweet for tweet in tweets if tweet['sentiment'] == 'neutral']
        print("Neutral tweets percentage: {} %".format(100*(len(netweets)/len(tweets))))
            #printing first 5 positive tweets 
        print("nnPositive tweets:")
        for tweet in ptweets[:10]:
            print(tweet['text'])
            #printing first 5 negative tweets  
        print("nnNegative tweets:") 
        for tweet in ntweets[:10]: 
            print(tweet['text']) 
    if __name__ == "__main__": 
                #calling main function 
            main()
  

Комментарии:

1. В class TwitterClient(object): , является ли object параметром? Если это так, его необходимо включить в __init__ определение вместо этого.

2. Правильно ли я также говорю, что main() это не часть TwitterClient() ?

3. Убедитесь, что отступ в вопросе соответствует вашему фактическому отступу. Мы попытались очистить форматирование вопроса, но, похоже, все было слишком запутано, чтобы мы могли сделать это правильно. Опубликуйте свой фактический код, затем используйте Ctl-k для отступа в нем 4 места.

4. Спасибо. Этот код выглядит как отступы, которые у меня есть.

Ответ №1:

Вот сокращенная версия вашего кода, которая демонстрирует проблему.

 class TwitterClient(object):
    None

    def main():
        api = TwitterClient()
        print("main()")


    if __name__ == "__main__":
        main()
  

Обратите внимание на отступ обоих main() и if __name__ == "__main__" поместите их под определение самого TwitterClient . Отсюда и ошибка в Python 3:

 Traceback (most recent call last):
  File "twitter-55610165.py", line 2, in <module>
    class TwitterClient(object):
  File "twitter-55610165.py", line 11, in TwitterClient
    main()
  File "twitter-55610165.py", line 6, in main
    api = TwitterClient()
NameError: name 'TwitterClient' is not defined
  

TwitterClient не определен, потому что определение класса TwitterClient не завершено — вы все еще внутри него. If находится на уровне области видимости класса, поэтому выполняется во время определения класса. Отступ многое определяет в области видимости в Python.

С небольшими, но важными изменениями в пробелах, чтобы main() вывести if __name__ ... область действия TwitterClient и вернуть их в основную область, проблема исчезает.

 class TwitterClient(object):
    None

def main():
    api = TwitterClient()
    print("main()")


if __name__ == "__main__":
    main()
  

т.е. эти конструкции теперь находятся на том же уровне отступа TwitterClient , что и, далее слева на один уровень отступа.

 $ python3 twitter-55610165.py
main()
  

Комментарии:

1. Большое спасибо! Вы объяснили это слишком четко. Я не могу поверить, что я это упустил. Я был так сосредоточен на том, что фактический код, возможно, ошибочен. Думаю, я пока не могу использовать python, lol

2. Теперь мне просто нужно работать над его улучшением / обучением лучше. Я только что протестировал его, и он выглядит в основном точным, но я попробовал анализ Хиллари, и он дал положительный твит: RT @Lrihendry: Мне кажется ясным, Мюллер перестал копать, когда все его туннели привели к Хиллари, Обаме и демократам.

Ответ №2:

Простое решение — удалить main() из TwitterClient() определения. Точная проблема заключается в том, что main() находится внутри TwitterClient() , другими словами, вы не закончили определение TwitterClient() , поэтому python выдает ошибки.

Как исправить

Самое простое решение — переместить main() if __name__... строки и из TwitterClient() определения. Это избавит вас от текущей ошибки. Этот код должен работать:

импортировать повторно импортировать tweepy из tweepy импортировать OAuthHandler из textblob импортировать класс TextBlob TwitterClient(object): «‘Общий класс Twitter для анализа настроений. «‘ def init(self): «‘ Конструктор класса или метод инициализации. «‘ # ключи и токены из консоли разработчика Twitter consumer_key = ‘удалить’ consumer_secret = ‘удалить’ access_token = ‘удалить-удалить’ access_token_secret = ‘удалить’

         # attempt authentication 
        try: 
        # create OAuthHandler object 
            self.auth = OAuthHandler(consumer_key, consumer_secret) 
        # set access token and secret 
            self.auth.set_access_token(access_token, access_token_secret) 
        # create tweepy API object to fetch tweets 
            self.api = tweepy.API(self.auth) 
        except: 
            print("Error: Authentication Failed") 

    def clean_tweet(self, tweet): 
        ''' 
        Utility function to clean tweet text by removing links, special characters 
        using simple regex statements. 
        '''
        return ' '.join(re.sub("(@[A-Za-z0-9] )|([^0-9A-Za-z t])|(w ://S )", " ", tweet).split())
    def get_tweet_sentiment(self, tweet): 
        ''' 
        Utility function to classify sentiment of passed tweet 
        using textblob's sentiment method 
        '''
        # create TextBlob object of passed tweet text 
        analysis = TextBlob(self.clean_tweet(tweet)) 
        # set sentiment 
        if analysis.sentiment.polarity > 0: 
            return 'positive'
        elif analysis.sentiment.polarity == 0: 
            return 'neutral'
        else: 
            return 'negative'
    def get_tweets(self, query, count = 10): 
        ''' 
        Main function to fetch tweets and parse them. 
        '''
        # empty list to store parsed tweets 
        tweets = [] 
        try: 
            # call twitter api to fetch tweets 
                fetched_tweets = self.api.search(q = query, count = count) 

            # parsing tweets one by one 
                for tweet in fetched_tweets: 
                # empty dictionary to store required params of a tweet 
                    parsed_tweet = {} 

                # saving text of tweet 
                    parsed_tweet['text'] = tweet.text 
                # saving sentiment of tweet 
                    parsed_tweet['sentiment'] = self.get_tweet_sentiment(tweet.text)
                # appending parsed tweet to tweets list 
                    if tweet.retweet_count > 0: 
                    # if tweet has retweets, ensure that it is appended only once 
                        if parsed_tweet not in tweets: 
                            tweets.append(parsed_tweet) 
                        else: 
                            tweets.append(parsed_tweet) 

                # return parsed tweets 
                return tweets 

        except tweepy.TweepError as e: 
            #print error (if any) 
                print("Error : "   str(e)) 

def main():
        #creating object of TwitterClient Class 
    api = TwitterClient()
        #calling function to get tweets 
    tweets = api.get_tweets(query = 'ADF', count = 200) 

        #picking positive tweets from tweets 
    ptweets = [tweet for  tweet in tweets if tweet['sentiment'] == 'positive'] 
        #percentage of positive tweets 
    print("Positive tweets percentage: {} %".format(100*len(ptweets)/len(tweets))) 
        #picking negative tweets from tweets 
    ntweets = [tweet for tweet in tweets if tweet['sentiment'] == 'negative'] 
        #percentage of negative tweets 
    print("Negative tweets percentage: {} %".format(100*len(ntweets)/len(tweets))) 
        #percentage of neutral tweets 
    netweets = [tweet for tweet in tweets if tweet['sentiment'] == 'neutral']
    print("Neutral tweets percentage: {} %".format(100*(len(netweets)/len(tweets))))
        #printing first 5 positive tweets 
    print("nnPositive tweets:")
    for tweet in ptweets[:10]:
        print(tweet['text'])
        #printing first 5 negative tweets  
    print("nnNegative tweets:") 
    for tweet in ntweets[:10]: 
            print(tweet['text']) 
if __name__ == "__main__": 
    #calling main function 
    main()