Warm tip: This article is reproduced from stackoverflow.com, please click
python python-3.x

Python 3.7 : Variable switching between int and str depending on usage

发布于 2020-03-27 15:41:43

I am working on a python Caesar cypher (for fun, I know it's not a good way to encrypt messages) and I ran into a problem. When I run the first bit of code, I get an error saying that the first arg in replace() must be a string, not an integer, when it is in face already a string ("TypeError: replace() argument 1 must be str, not int").

However, whenever I try to use it as an indice for a string, it tells me it is not an int ("TypeError: string indices must be integers").

Here is the code, thanks in advance. (There are a few more parts to the code but I don't think they're relevant to the question.)

def find_str(s, char):

    index = 0

    if char in s:
        c = char[0]
        for ch in s:
            if ch == c:
                if s[index:index+len(char)] == char:
                    return index

            index += 1

    return -1

class Alpha:

    def __init__(self, message, key):

        self.fKey = key
        self.msg = str(message)
        self.alpha = []
        self.spcLoc = []
        self.spcNum = 0
        self.encryptedMessage = str(self.msg)

    def encMsg(self):

        for letter in self.spcNum):
            str.replace(letter, find_str(self.alpha,letter) + self.fKey, self.spcNum) 

def main():

    msg = 'This is sparta'
    key = 1

    a = Alpha(msg, key)
    a.encMsg()

Questioner
DGGB
Viewed
16
7,105 2020-01-31 23:19
for letter in self.spcNum:

This is a for-each loop which loops over every value in self.spcNum.

For example

for letter in ['a','b','c']:
   print(letter)

will print out the letters a, b and c.

You can not iterate over self.spcNum. Because it is an integer (with the value 0) not a list.

There are other problems in the code too,

str.replace(letter, find_str(self.alpha,letter) + self.fKey, self.spcNum)

You're using this method incorrectly.

Correct usage:

stringYouWantEdited = "hi, my name is DGGB, hi"
substringYouWantReplaced = "hi"
newSubstring = "hello"
numberOfTimesThisShouldHappen = 1


newString = stringYouWantEdited.replace(substringYouWantReplaced , newSubstring , numberOfTimesThisShouldHappen )
print(newString)