Псевдоним в Python

#python #syntax

Вопрос:

Есть ли способ запустить функцию Python, просто введя одно слово без скобок? Я замечаю, что вы не можете просто назначить его как x = function() функцию, так как это было бы значением функции в данный момент.

Разве вы не можете назначить выполнение функции, соответствующей переменной?

Комментарии:

1. Как насчет того, чтобы попробовать сначала?

2. Вы задаете два разных вопроса… один о запуске (он же вызов ) функции, а другой о назначении функции переменной. Вы можете назначить , просто выполнив x = function , затем вы можете вызвать его с помощью или x() или function() .

3. @MarcinOrlowski — как бы вы попробовали, если бы не знали, что попробовать?

4. @MarcinOrlowski это довольно несправедливо, учитывая, насколько маловероятно, что вы даже знаете, о чем просит ОП. Я не. Похоже, они просят «запустить функцию Python, просто введя одно слово без скобок». Я не думаю, что это можно сделать, но поиск негатива на самом деле не так прост.

5. …что приведет вам множество примеров назначения функции переменной и ничего не скажет вам о том, как » запустить функцию Python, просто введя одно слово без скобок».

Ответ №1:

Не то чтобы я мог представить себе какое-либо разумное применение для этого, но вы могли бы подкласс string и переопределить метод представления, чтобы выполнить какой-то побочный эффект..

 In [15]: class StringWithSideEffect(str):
    ...:     def __repr__(self):
    ...:         print("foo")
    ...:         return super().__repr__()
    ...:

In [16]: x = StringWithSideEffect("bar")

In [17]: x
Out[17]: foo
'bar'
 

Комментарии:

1. С большой властью приходит большая ответственность.

Ответ №2:

насколько я знаю, нет такой вещи, как назначение вызова функции переменной.

однако с помощью встроенного property класса python вы можете назначить вызов функции атрибуту класса:

 class FunctionHook:
    def __init__(self, func, *args, **kwargs):
        # args and kwargs are the arguments passed into the function
        self.func = func
        self.args = args
        self.kwargs = kwargs
    @property
    def get(self):  # or however you want to name the relevant attribute
        return self.func(*self.args, **self.kwargs)

# testing
if __name__ == '__main__':
    import random
    a = FunctionHook(random.random)
    for _ in range(5):
        print(a.get)
    b = FunctionHook(random.randint, 13, 31)
    for _ in range(5):
        print(b.get)
 

выход:

 0.8434998046303654
0.2421758878321828
0.10999563726010275
0.3725559440217763
0.1906822598056529
29
28
27
31
13