Обычный способ обойти эту проблему - создать собственный модуль поиска, то есть FindXXX.cmake
(в вашем случае это FindLwIP.cmake
), чтобы вы могли создать переменную LwIP_INCLUDE_DIRS
внутри пакета.
set(LwIP_INCLUDE_DIRS
${CMAKE_CURRENT_LIST_DIR}/../LwIP/include
${CMAKE_CURRENT_LIST_DIR}/../LwIP
${CMAKE_CURRENT_LIST_DIR}/../LwIP/include/XXX)
.
.
(omitted..)
.
.
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LwIP DEFAULT_MSG LwIP_INCLUDE_DIRS LwIP_SOURCES LwIP_HEADERS)
С помощью вышеуказанного модуля поиска ваше приложение может корректно включать пакет и использовать переменные, созданные с помощью модуля find.
find_package(LwIP REQUIRED)
.
.
(omitted...)
.
.
include_directories(LwIP_INCLUDE_DIRS)
add_executable(${PROJECT_NAME}.elf ${SOURCES})
Так как ваша работа связана с STM32 & amp; cmake, позвольте мне дать вам отличный справочник, который также станет хорошей отправной точкой для вашей работы.
https://github.com/ObKo/stm32-cmake.git
Надеюсь, это поможет.
Использовать isinstance ()
. Пример:
if isinstance(n, unicode):
# do this
elif isinstance(n, Node):
# do that
...
>>> isinstance('a', str)
True
>>> isinstance(n, Node)
True
Нет, аргументы проверки типов в Python не нужны. Это никогда необходимо.
Если ваш код принимает адреса как необработанную строку или как объект Node
, ваш
дизайн нарушен.
Это происходит из-за того факта, что если вы еще не знаете тип объект в вашей собственной программе, то вы уже делаете что-то не так.
Проверка типов вредит повторному использованию кода и снижает производительность. Имея функцию который выполняет разные вещи в зависимости от типа передаваемого объекта подвержен ошибкам и имеет поведение, более трудное для понимания и поддержки.
У вас есть следующие более разумные опции:
Создать конструктор объекта Node
, который принимает необработанные строки, или функцию
который преобразует строки в объектах Node
. Сделайте так, чтобы ваша функция принимала
переданный аргумент является объектом Node
. Таким образом, если вам нужно пройти
Строка для функции, которую вы просто делаете:
myfunction (Node (some_string))
Это ваш лучший вариант, он чистый, легкий для понимания и обслуживания. Любой, кто читает код, сразу понимает, что происходит, и вам не нужно проверять тип.
Сделайте две функции, одну, которая принимает объекты Node
и одну, которая принимает
rawstrings. Вы можете сделать один звонок другой внутри, в большинстве
удобный способ ( myfunction_str
может создать объект Node
и вызвать
myfunction_node
или наоборот).
Объекты Make Node
имеют метод __ str __
и внутри вашей функции,
вызовите str ()
для полученного аргумента. Таким образом, вы всегда получаете строку
по принуждению.
В любом случае, не проверять тип . Это совершенно ненужно и имеет только отрицательные стороны. Вместо этого реорганизуйте ваш код так, чтобы вам не нужно было проверять его. Вы получаете только выгоды, как в краткосрочной, так и в долгосрочной перспективе.
Вы также можете использовать try catch для проверки типа при необходимости:
def my_function(this_node):
try:
# call a method/attribute for the Node object
if this_node.address:
# more code here
pass
except AttributeError, e:
# either this is not a Node or maybe it's a string,
# so behavior accordingly
pass
Вы можете увидеть пример этого в Начиная Python во втором о генераторах (стр. 197 в моем издании), и я верю в Python Cookbook . Много раз перехватывать AttributeError
или TypeError
проще и, видимо, быстрее. Кроме того, это может работать лучше всего таким образом, потому что тогда вы не привязаны к конкретному дереву наследования (например, ваш объект может быть узлом
или это может быть какой-то другой объект, который ведет себя так же, как Узел
).
Звучит так, будто вы ищете «универсальную функцию», которая работает по-разному в зависимости от заданных аргументов. Это немного похоже на то, как вы получите другую функцию при вызове метода для другого объекта, но вместо того, чтобы просто использовать первый аргумент (объект / себя) для поиска функции, вместо которой вы используете все аргументы.
Turbogears использует что-то подобное для принятия решения о том, как преобразовать объекты в JSON - если я правильно помню.
Есть статья от IBM об использовании пакета диспетчера для такого рода вещей:
Из этого article:
import dispatch
@dispatch.generic()
def doIt(foo, other):
"Base generic function of 'doIt()'"
@doIt.when("isinstance(foo,int) and isinstance(other,str)")
def doIt(foo, other):
print "foo is an unrestricted int |", foo, other
@doIt.when("isinstance(foo,str) and isinstance(other,int)")
def doIt(foo, other):
print "foo is str, other an int |", foo, other
@doIt.when("isinstance(foo,int) and 3<=foo<=17 and isinstance(other,str)")
def doIt(foo, other):
print "foo is between 3 and 17 |", foo, other
@doIt.when("isinstance(foo,int) and 0<=foo<=1000 and isinstance(other,str)")
def doIt(foo, other):
print "foo is between 0 and 1000 |", foo, other