10

I want to have a plain old function as a class constant. However, Python "helpfully" turns it into a method for me:

class C(object):
    a = 17
    b = (lambda x : x+1)

print C.a     # Works fine for int attributes
print C.b     # Uh-oh... is a <unbound method C.<lambda>> now
print C.b(1)  # TypeError: unbound method <lambda>() must be called
              #    with C instance as first argument (got int instance instead)
  • Is there a way to prevent my function from becoming a method?
  • In any case, what is the best "Pythonic" approach to this problem?
1
  • Note, the above code works fine in Python 3, where the concept of unbound methods is gone: python.org/download/releases/3.0/whatsnew . C.b is simply a function, usable as such in the usual manner. Commented Jun 10, 2022 at 13:38

3 Answers 3

23

staticmethod:

class C(object):
    a = 17

    @staticmethod
    def b(x):
      return x+1

Or:

class C(object):
    a = 17
    b = staticmethod(lambda x : x+1)
Sign up to request clarification or add additional context in comments.

Comments

4

Use staticmethod:

class C(object):
    a = 17
    @staticmethod
    def b(x):
        return x + 1

1 Comment

But you should consider these caveats.
4

Define your function in a module but not class. It's better in your case.

First paramter of normal python method is self, self must be an instance object.

you should use staticmethod:

class C(object):
    a = 17
    b = staticmethod(lambda x: x+1)
print C.b(1)
# output: 2

or add self parameter, and make an instance of C:

class C(object):
    a = 17
    b = lambda self, x: x+1
c = C()
c.b(1)
# output: 2

another choice is using classmethod (just show you can do this):

class C(object):
    a = 17
    b = classmethod(lambda cls, x: x+1)
C.b(1)
# output: 2

1 Comment

Interesting - lambdas need to be wrapped in staticmethod/classmethod too. I wasn't aware of this before.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.