Why is using 'eval' a bad practice?

eval, python

Solution

Yes, using `eval` is a bad practice. Just to name a few reasons:

- There is almost always a better way to do it

- Very dangerous and insecure

- Makes debugging difficult

- Slow

In your case you can use setattr instead:

class Song:
    """The class to store the details of each song"""
    attsToStore=('Name', 'Artist', 'Album', 'Genre', 'Location')
    def __init__(self):
        for att in self.attsToStore:
            setattr(self, att.lower(), None)
    def setDetail(self, key, val):
        if key in self.attsToStore:
            setattr(self, key.lower(), val)

There are some cases where you have to use `eval` or `exec`. But they are rare. Using `eval` in your case is a bad practice for sure. I'm emphasizing on bad practice because `eval` and `exec` are frequently used in the wrong place.

Replying to the comments:

It looks like some disagree that `eval` is 'very dangerous and insecure' in the OP case. That might be true for this specific case but not in general. The question was general and the reasons I listed are true for the general case as well.

Problem

I use the following class to easily store data of my songs. ``` class Song: """The class to store the details of each song""" attsToStore=('Name', 'Artist', 'Album', 'Genre', 'Location') def __init__(self): for att in self.attsToStore: exec 'self.%s=None'%(att.lower()) in locals() def setDetail(self, key, val): if key in self.attsToStore: exec 'self.%s=val'%(key.lower()) in locals() ``` I feel that this is just much more extensible than writing out an `if/else` block. However, I have heard that `eval` is unsafe. Is it? What is the risk? How can I solve the underlying problem in my class (setting attributes of `self` dynamically) without incurring that risk?

Original source

Related problems