Tempo estimado de leitura: 3 atas
Assim, poderá estar a utilizar as Classes Python e ter encontrado o problema TypeError: O primeiro argumento deve poder ser invocado. Então, o que significa o problema e como pode resolvê-lo?
Neste artigo, procuramos explicar como isso pode ocorrer e a solução fácil que se pode aplicar para parar o problema no futuro.
Compreendamos primeiro a chamada Funções/Métodos
Normalmente num programa de pitão de computador, terá de utilizar uma função/método , uma vez que tem a funcionalidade que lhe poupará tempo, e pode ser reutilizada continuamente.
Um exemplo clássico é a impressão ("Olá") que trata de toda a lógica necessária para mostrar isto num ecrã. A sua produção é rapidamente visível, e não há qualquer necessidade de compreender o que se passa no fundo.
Aqui neste exemplo, executámos a função por si só, como resultado, não precisa de apontar para outro lugar para executar a lógica que contém.
O erro que procuramos resolver é parte do problema. Uma função/método pode ser executado por si só, ou a partir de uma Classe.
A diferença que define é que por si só precisa do parêntesis, ou seja (), mas se o chamarmos de dentro de uma classe, então tem de ser tratado de forma diferente.
Ver o Tipo Erro Primeiro Argumento deve poder ser chamado e corrigido
No bloco de código abaixo, temos um bloco de código, que produz o erro que estamos a tentar corrigir.
No seguimento do que foi discutido acima, a linha ofensiva é realçada.
Em particular, o problema reside no progresso da impressão(). Isto foi chamado, mas na realidade, o problema é que quando se tem a lógica escrita desta forma, dá o erro para o qual este post do blogue foi configurado.
Em essência, está a tentar executar o programa a partir desse ponto exacto, o que a pitão não permite.
A remoção do parêntese permite então que o programa vá e encontre o módulo que está a referenciar e depois execute a lógica contida dentro dele.
import schedule
import time
class scheduleprint():
def printprogress(self):
print("Start of Processing")
print("Processing Complete")
def schedule_a_print_job(self, type="Secs", interval=5):
if type == "Secs": # Fed from the function paramaters
schedule.every(interval).seconds.do(self.printprogress())===> The problem is here, remove the () after printprogress.
# Including the parentheses after printprogess will throw an error as you cant run that method directly from there you can only call it.
if type == "Mins": # Fed from the function paramaters
schedule.every(interval).minutes.do(self.printprogress)
# Including the parentheses after printprogess will throw an error as you cant run that method directly from there you can only call it.
while True:
schedule.run_pending()
time.sleep(1) # The number of seconds the Python program should pause execution.
run = scheduleprint() # initiating an instance of the class "scheduleprint"
run.schedule_a_print_job() # running the function contained within the class.
Em resumo, para ajudar a resolver este problema:
(A) Verifique o seu código para ver onde está a chamar um módulo dentro de uma classe.
(B) Em seguida certifique-se de que nessa chamada não existem parênteses, caso contrário não conseguirá encontrar o módulo.