Defining __getattr__ and __getitem__ on a function has no effect

2024/9/28 21:29:10

Disclaimer This is just an exercise in meta-programming, it has no practical purpose.

I've assigned __getitem__ and __getattr__ methods on a function object, but there is no effect...

def foo():print "foo!"foo.__getitem__ = lambda name: name
foo.__getattr__ = lambda name: name
foo.baz = 'baz'

Sanity check that we can assign properties to a function:

>>> foo.baz
'baz'

Neat. How about the "magic getters"?

>>> foo.bar
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'bar'>>> foo['foo']
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: 'function' object is not subscriptable>>> getattr(foo, 'bar')
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'function' object has no attribute 'bar'

Is it possible to have a "magic getter" on a function object?

Answer

Nope! Assigning __getitem__ to an instance doesn't work on any type of object:

>>> class A(object):
...   pass
...
>>> a = A()
>>> a.__getattr__ = lambda name: name
>>> a.foo
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute 'foo'

And you can't define __getattr__ on the built-in function type:

>>> import types
>>> types.FunctionType.__getitem__ = lambda name: name
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'function'

And you can't subclass types.FunctionType:

>>> import types
>>> class F(types.FunctionType):
...   pass
... 
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
type 'function' is not an acceptable base type
https://en.xdnf.cn/q/71293.html

Related Q&A

thread._local object has no attribute

I was trying to change the logging format by adding a context filter. My Format is like thisFORMAT = "%(asctime)s %(VAL)s %(message)s"This is the class I use to set the VAL in the format. cla…

Pytorch batch matrix vector outer product

I am trying to generate a vector-matrix outer product (tensor) using PyTorch. Assuming the vector v has size p and the matrix M has size qXr, the result of the product should be pXqXr.Example:#size: 2 …

Scraping Google Analytics by Scrapy

I have been trying to use Scrapy to get some data from Google Analytics and despite the fact that Im a complete Python newbie I have made some progress. I can now login to Google Analytics by Scrapy b…

Pandas representative sampling across multiple columns

I have a dataframe which represents a population, with each column denoting a different quality/ characteristic of that person. How can I get a sample of that dataframe/ population, which is representa…

TensorFlow - Ignore infinite values when calculating the mean of a tensor

This is probably a basic question, but I cant find a solution:I need to calculate the mean of a tensor ignoring any non-finite values.For example mean([2.0, 3.0, inf, 5.0]) should return 3.333 and not …

encode unicode characters to unicode escape sequences

Ive a CSV file containing sites along with addresses. I need to work on this file to produce a json file that I will use in Django to load initial data to my database. To do that, I need to convert all…

Python: Regarding variable scope. Why dont I need to pass x to Y?

Consider the following code, why dont I need to pass x to Y?class X: def __init__(self):self.a = 1self.b = 2self.c = 3class Y: def A(self):print(x.a,x.b,x.c)x = X() y = Y() y.A()Thank you to…

Python/Pandas - partitioning a pandas DataFrame in 10 disjoint, equally-sized subsets

I want to partition a pandas DataFrame into ten disjoint, equally-sized, randomly composed subsets. I know I can randomly sample one tenth of the original pandas DataFrame using:partition_1 = pandas.Da…

How to fix pylint error Unnecessary use of a comprehension

With python 3.8.6 and pylint 2.4.4 the following code produces a pylint error (or recommendation) R1721: Unnecessary use of a comprehension (unnecessary-comprehension)This is the code: dict1 = {"A…

conv2d_transpose is dependent on batch_size when making predictions

I have a neural network currently implemented in tensorflow, but I am having a problem making predictions after training, because I have a conv2d_transpose operations, and the shapes of these ops are d…