*args
и **kwargs
общая идиома должна позволить произвольное число аргументов функциям, как описано в разделе больше по определению функций в документации Python.
*args
даст Вам всем параметры функции как кортеж:
In [1]: def foo(*args):
...: for a in args:
...: print a
...:
...:
In [2]: foo(1)
1
In [4]: foo(1,2,3)
1
2
3
**kwargs
даст Вам всем аргументы ключевого слова за исключением тех, которые соответствуют формальному параметру как словарь.
In [5]: def bar(**kwargs):
...: for a in kwargs:
...: print a, kwargs[a]
...:
...:
In [6]: bar(name='one', age=27)
age 27
name one
Обе идиомы могут быть смешаны с нормальными аргументами для разрешения фиксированного ряда и некоторые аргументы переменной:
def foo(kind, *args, **kwargs):
pass
Другое использование *l
идиома должна распаковать списки аргументов при вызывании функции.
In [9]: def foo(bar, lee):
...: print bar, lee
...:
...:
In [10]: l = [1,2]
In [11]: foo(*l)
1 2
В Python 3 возможно использовать *l
на левой стороне присвоения (Расширенная Повторяемая Распаковка), хотя это дает список вместо кортежа в этом контексте:
first, *rest = [1,2,3,4]
first, *l, last = [1,2,3,4]
Также Python 3 добавляет новый семантический (отошлите PEP 3102):
def func(arg1, arg2, arg3, *, kwarg1, kwarg2):
pass
Такая функция принимает только 3 позиционных параметра и все после *
может только быть передан как аргументы ключевого слова.
You can't create dynamic operators - but you can wrap an operator in a delegate. You can use lambdas to simplify the syntax.
Func<int,int,int> opPlus = (a,b) => a + b;
Func<int,int,int> opMinus = (a,b) => a - b;
// etc..
// now you can write:
int a = 5, b = 6;
Func<int,int,int> op = opPlus;
if( op(a,b) > 9 )
DoSomething();
Although it's not definite - the future direction for C# is to implement the compiler as a service. So, at some point, it may be possible to write code that dynamically evaluates an expression.
Piggybacking on LBushkin's response:
Func<int, int, bool> AGreaterThanB = (a,b) => a > b;
Func<int, int, bool> ALessThanB = (a,b) => a < b;
Func< int, int, bool> op = AGreaterThanB;
int x = 7;
int y = 6;
if ( op( x, y ) )
{
Console.WriteLine( "X is larger" );
}
else
{
Console.WriteLine( "Y is larger" );
}
You might find something like Flee helpful. There are others, but their names escape me right now.
В C # 4.0 будет ключевое слово dynamic для динамической типизации.