Я удивлен, что никто не упоминает регулярное выражение, потому что иногда строка должна быть подготовлена и нормализована до того, как будет использована функция
import re
def parseNumber(value, as_int=False):
try:
number = float(re.sub('[^.\-\d]', '', value))
if as_int:
return int(number + 0.5)
else:
return number
except ValueError:
return float('nan') # or None if you wish
:
parseNumber('13,345')
> 13345.0
parseNumber('- 123 000')
> -123000.0
parseNumber('99999\n')
> 99999.0
и, кстати, что-то убедитесь, что у вас есть номер:
import numbers
def is_number(value):
return isinstance(value, numbers.Number)
# will work with int, float, long, Decimal
print_add
является нестатической функцией-членом из foo
, что означает, что она должна быть вызвана в экземпляре Foo
; поэтому он имеет неявный первый аргумент, указатель this
.
Используйте lambda, который захватывает экземпляр foo
и вызывает print_add
на нем.
Foo foo;
test([&foo](int i){ foo.print_add(i); });
Другой опция должна использовать std::bind
для привязки экземпляра foo
:
test(std::bind(&Foo::print_add, &foo, std::placeholders::_1));
ПРОБЛЕМА
Вы не можете напрямую привязать указатель на функцию -функции-функции , принадлежащий типу Foo
к std::function<void(int)>
, в частности, потому что вызов нестатического члена -функция требует экземпляра типа Foo
.
Foo obj; obj.member_function (); // can't call `member_function` without `obj`
Примечание. Однако вы можете привязать &Foo::print_add
к std::function<void(Foo&, int)> x;
и называть его как x(instance_of_Foo, arg);
.
Примечание. Также возможно привязать его к std::function<void(Foo*, int>
, для чего потребуется Foo*
вместо lvalue типа Foo
.
РЕШЕНИЕ
Вместо этого вы можете использовать std::bind
- bind экземпляр Foo
для рассматриваемой функции-члена, например, в ниже пример:
int main(){
Foo foo;
test (std::bind (&Foo::print_add, foo, std::placeholders::_1));
return 0;
}
Выше мы привязываем экземпляр Foo
с именем foo
к указателю функции-функции &Foo::print_add
.
Использование std::placeholders::_1
сообщает std::bind
, что мы хотели бы, чтобы он сгенерировал функциональный объект , который можно вызвать, используя один (1) аргумент.
С в приведенном выше фрагменте вы будете иметь поведение, о котором вы сейчас просите; my_func(5)
будет эквивалентным вызову foo.print_add (5)
.
ДОКУМЕНТАЦИЯ