Python Forum

Full Version: Code printing twice
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I'm making a Discord.py bot with a utilities package. In the utilities package, there are 3 files which are together causing the logic error.

"""
Database.py
-----------
Database format:

  {
    "SectionNameHere" : {
      "foo" : "bar"
    },
    "2ndSectionNameHere" : {
      "foo" : "bar"
    },
    "3rdSectionNameHere" : {
      "foo" : "bar"
    }
  }

"""
import json

class database:
  def __init__(self, *args, **kwargs):
    self.args = args
    self.kwargs = kwargs
    self.data = None
  def set(self):
    with open("Resources/database.json", "r") as DB:
      self.clean()
      self._data = DB.read()
      self.data = json.loads(str(self._data))
  def clean(self):
    with open("Resources/database.json", "r") as fData:
      oData = fData.read()
    with open("Resources.json", "w") as wData:
      wData.write(oData.replace("'", "\""))
  def init(self):
    self.clean()
    self.set()
(database.json)
{
  "userdata" : {
    "help" : "nope"
  }
}
(Giveaway.py)
import random
import Utilities.database as database
class giveaway:
  def __init__(self, Name):
    self.reward = Name
    self.contestants = []
  def contestantJoin(self, user):
    self.contestants.append(user)
  def chooseWinner(self):
    return random.choice(self.contestants)
  def delete(self):
    del self
    
# If a giveaway is saved in memory, load it automaticly
db = database.database()
db.init()
print(db.data["userdata"]["help"])
Now this should print Nope once, but instead it prints Nope twice.
Output:
nope nope
I'm using python 3.6 Win7. Any help would be appreciated! Thanks in advance!
Works fine for me (2.7 and 3.6). I did put all the code in one file, and changed the file names, but I don't think that should have changed anything. How exactly are you calling the program?
what is the name of the first program.
Too many things named database, makes it confusing.
this code in giveaway.py will always run.
# If a giveaway is saved in memory, load it automaticly
db = database.database()
db.init()
print(db.data["userdata"]["help"])
if you only want this to run if the program is executed from command routine, change to:
if __name__ == '__main__':
            # If a giveaway is saved in memory, load it automaticly
    db = database.database()
    db.init()
    print(db.data["userdata"]["help"])
some other items, indentation should be 4.
set is a bad name for a method as it as a python command.
you should add an empty line between methods to make code more readable.
Quote:if you only want this to run if the program is executed from command routine, change to:
if __name__ == '__main__':
            # If a giveaway is saved in memory, load it automaticly
    db = database.database()
    db.init()
    print(db.data["userdata"]["help"])
Suprisingly enough, the if '__name__' == '__main__': fixed it.

Quote:Works fine for me (2.7 and 3.6). I did put all the code in one file, and changed the file names, but I don't think that should have changed anything. How exactly are you calling the program?
I'm running it from importing a different file.

(init.py)
initmsg = ["``dsconfig\nInitializing Utilities (Spooper/Utilities/__init__.py)\n\n"]

initmsg.append("Initializing Database.py (Spooper/Utilities/database.py)\n")

import Utilities.database as database

initmsg.append("Finished Initializing Database.py (Spooper/Utilities/database.py)\n\n")

initmsg.append("Initializing Giveaway.py (Spooper/Utilities/giveaway.py)\n")

import Utilities.giveaway as giveaway

initmsg.append("Finished Initializing Giveaway.py (Spooper/Utilities/database.py)\n\n")

initmsg.append("Finished Initializing Utilities (Spooper/Utilities/__init__.py)\n")

initmsg.append("\n``")
initmsg = ''.join(initmsg)