I was looking through some of the Django source code and came across this. What exactly does: encoding = property(lambda self: self.file.encoding) do?
I was looking through some of the Django source code and came across this
Share
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
There’s nothing wrong with the other two answers, but they might be a little high-level. So here’s the 101 version:
lambda
Although it’s in their documentation for C#, I think Microsoft actually has the best explanation of the concept of lambda:
Most people without an official CS degree trip over lambda, but when you think of it as simply an “anonymous function”, I think it becomes much easier to understand. The format for lambda in Python is:
Where
[argument]can be nothing, a single argument or a comma-delimited list of arguments and[expression]is essentially the method body. That’s why @Jordan said the code you mentioned is roughly the equivalent of:selfis the argument passed into the method and the return value of the method (self.file.encoding) is the expression.property
The
propertymethod allows you to create “getters” and “setters”, basically, for an attribute on a class. In traditional OOP, “members”, or the attributes of a class, are usually set as protected or private — you never actually access the attribute directly. Instead, you access methods that in turn retrieve or manipulate the attribute. Chief among those would get the getter and the setter. As their names pretty much describe, they are methods that get and set the value of an attribute, respectively.Now, Python OOP doesn’t really have a concept of protected or private attributes in the truest sense. You are free to follow the rules, but there’s nothing stopping you from accessing anything you want on a class. So, getters and setters are most normally, in Python, used in conjunction with
propertyto “fake” an attribute, for lack of a better word. For example:With that I can now do things like
instance.foo(no parenthesis) andinstance.foo = 'something'. And it works just as iffoowas a regular attribute on the class.In the code you mention, they’re only setting a getter, but it works the same.
encodingwill act like an attribute on the class and returns the value offile.encoding.