문제

이 있다고 가정해 봅시 Fortran90 를 포함하는 모듈 의 변수를,기능 및 서브루틴.에 USE 문 협약 당신이 따른다:

  1. 명시적으로 선언하는 변수/수/서브 루틴이 당신과 함께 사용하기 , only : 구문,등 USE [module_name], only : variable1, variable2, ...?
  2. 삽입 담요 USE [module_name]?

에 한 손으로, only 절게 만든 코드를 조금 더 자세한 정보를 표시합니다.그러나,그것은 당신을 반복하에서 자신의 코드고 당신의 모듈을 포함 변수의/수/서브루틴,일이 어려운합니다.

예를 들어 다음과 같습니다.

module constants
  implicit none
  real, parameter :: PI=3.14
  real, parameter :: E=2.71828183
  integer, parameter :: answer=42
  real, parameter :: earthRadiusMeters=6.38e6
end module constants

program test
! Option #1:  blanket "use constants"
!  use constants
! Option #2:  Specify EACH variable you wish to use.
  use constants, only : PI,E,answer,earthRadiusMeters
  implicit none

  write(6,*) "Hello world.  Here are some constants:"
  write(6,*) PI, &
       E, &
       answer, &
       earthRadiusInMeters
end program test

업데이트 희망이 사람이 같은 것을 말한다 "그래?그냥 레코딩에서는 C#!" 그래서 나는 아래로 투표할 수 있다.


업데이트

팀 질의 응답, 를 비교하는 프로그램의 USE modulename 파이썬's from modulename import *.주제에는 스택에서 오버플로기:

  • '가져오기 모듈'또는'에서 모듈에 가져오기'

    • 응답, 마크,로디 언급:

      를 사용하지 않는'에서 모듈에 가져오기*'.대 모든 합리적인 큰 설정 코드의 경우 당신이'가져오기*'당신의 가능성이 될 것입 시멘트를 바르는 그것으로 모듈을 수 없 를 제거할 수 있습니다.이 때문에 그것이 하기 어려운 결정하는 데 사용되는 항목 코드에서는 오는'에서 모듈', 그 동쪽 지점에 도착 어디에 당신이 생각하지 않 사용 가져오는 더 이상 그러나 그것의 매우 어렵 확인 할 수 있습니다.

  • 무엇이 좋은 엄지손가락의 규칙에 대한 python imports?

    • dbr 의 응답 담고

      하지 않 x 에서 가져오기*-그것은 귀하의 코드를 이해하기 매우 어려운로 당신은 쉽게 볼 수 없는 방법 에서 나온(x 에서 가져오기*;에서 y 가져오기*;my_func()-어디 my_func 정의된?)

그래서 나는 기대로의 합의 명시적으로 모든 항목 내에서 사용하는 모듈을 통해

USE modulename, only : var1, var2, ...

Stefano 언급 Borini,

는 경우에 당신은 모듈을 이렇게 큰 당신 픈만 추가,그것은 의미 는 모듈은 너무 큽니다.분니다.

도움이 되었습니까?

해결책

균형의 문제입니다.

모듈에서 몇 가지만 사용하는 경우 사용중인 내용을 명확하게 지정하기 위해 추가하는 경우에만 적합합니다.

모듈에서 많은 물건을 사용하는 경우 지정하면 많은 것들만이 뒤 따릅니다. 당신은 기본적으로 당신이 사용하는 것을 체리 따기하고 있지만, 진정한 사실은 당신이 해당 모듈 전체에 의존한다는 것입니다.

그러나 결국 가장 좋은 철학은 이것입니다. 네임 스페이스 오염에 대해 걱정하고 모듈이 너무 커서 추가 할 수 있다고 느끼면 모듈이 너무 큽니다. 나눠.

업데이트 : Fortran? 그냥 파이썬으로 다시 코딩하십시오;)

다른 팁

나는 그냥 그렇게 use modulename -그 다음으로 내 응용 프로그램을 성장,내가 그것을 발견 더 많은 찾기 어려운 원하는 기능(켜지 않고하 grep)-의 일부는 다른 코드를 떠 사무실 주변에 아직도 사용 중 하나-서브루틴-당 파일이 있는 그것의 자신의 세트의 문제이지만,그것은 훨씬 쉽게 사용하는 텍스트 편집기를 통해 이동하는 코드고 신속하게 추적하게 당신이 필요합니다.

를 경험 한 후 이것이 되었으로 변환을 사용하여 use...only 언제 가능합니다.또한 시작했을 따기 Python,볼과 같은 방법으로 from modulename import *.의 많은 훌륭한 일을 하는 모듈을 줄 당신은,그러나 내가 선호하는 글로벌 네임스페이스 단단히 통제됩니다.

여기서 질문에 정확하게 대답하지 않고, 어떤 이유로 든 모듈을 분할하고 네임 스페이스 충돌을 얻기 시작하지 않으면 어떤 상황에서 유용한 다른 솔루션을 던지는 것입니다. 파생 된 유형을 사용하여 하나의 모듈에 여러 네임 스페이스를 저장할 수 있습니다.

변수의 논리적 그룹화가있는 경우 각 그룹에 대해 자신의 파생 유형을 만들고 모듈 에이 유형의 인스턴스를 저장 한 다음 필요한 그룹 만 가져올 수 있습니다.

작은 예 : 우리는 많은 데이터가 있으며 그 중 일부는 사용자 입력이며 일부는 기타 초기화의 결과입니다.

module basicdata
   implicit none
   ! First the data types...
   type input_data
      integer :: a, b
   end type input_data
   type init_data
      integer :: b, c
   end type init_data

   ! ... then declare the data
   type(input_data) :: input
   type(init_data) :: init
end module basicdata

이제 서브 루틴이 데이터 만 사용하는 경우 init, 당신은 그냥 가져옵니다 :

subroutine doesstuff
   use basicdata, only : init
   ...
   q = init%b
end subroutine doesstuff

이것은 확실히 보편적으로 적용 가능한 솔루션이 아니며, 파생형 유형 구문에서 약간의 구동성을 얻으면 모듈이없는 경우 거의 도움이되지 않습니다. basicdata 위에 정렬하지만 대신 a allthestuffivebeenmeaningtosortout다양성. 어쨌든, 나는 이런 식으로 뇌에 더 쉽게 맞는 코드를 얻는 데 운이 좋았습니다.

사용의 주요 장점은 저에게만 제가 필요하지 않은 물건으로 글로벌 네임 스페이스를 오염시키는 것을 피하는 것입니다.

이전에 주어진 대부분의 답변에 동의했습니다. use ..., only: ... 이동하는 방법, 의미가있는 경우 유형을 사용하고 적용하십시오. 파이썬 사고 가능한 한 많이. 또 다른 제안은 수입 모듈에서 적절한 명명 규칙을 사용하는 것입니다. private / public 진술.

예를 들어, netcdf 라이브러리 사용 nf90_<some name>, 수입업자 측의 네임 스페이스 오염을 제한합니다.

use netcdf  ! imported names are prefixed with "nf90_"

nf90_open(...)
nf90_create(...)
nf90_get_var(...)
nf90_close(...)

마찬가지로 NCIO 이 라이브러리에 래퍼가 사용됩니다 nc_<some name> (nc_read, nc_write...).

중요하게도, 그러한 디자인은 어디에 있는지에 대한 것입니다 use: ..., only: ... 관련성이 떨어지면 적절한 설정을 통해 가져온 모듈의 네임 스페이스를 더 잘 제어 할 수 있습니다. private / public 헤더의 속성은 독자가 직면 한 "오염"수준을 평가하기에 충분한 것을 간단히 살펴볼 수 있도록 충분합니다. 이것은 기본적으로 동일합니다 use ..., only: ..., 그러나 가져온 모듈 측면에서 - 따라서 각 가져 오기에서는 한 번만 작성해야합니다).

한 가지 더 : 객체 지향과 파이썬에 관한 한, 내 견해의 차이는 Fortran이 비교적 새로운 표준이기 때문에 유형 바운드 절차를 실제로 장려하지 않는다는 것입니다 (예 : 많은 도구와 호환되지 않습니다. , 덜 합리적으로는, 그것은 단지 비정상적입니다), 그것은 절차가없는 파생 유형 사본과 같은 편리한 행동을 깨뜨리기 때문입니다 (type(mytype) :: t1, t2 그리고 t2 = t1). 즉, 종종 클래스 대신 유형과 모든 유형의 절차를 가져와야합니다. 이것만으로도 파이썬에 비해 Fortran 코드가 더욱 장점을 만들고 접두사 이름 지정 규칙과 같은 실제 솔루션은 유용 할 수 있습니다.

IMO, 결론은 : Python이 가르치는대로 읽을 사람들을위한 코딩 스타일을 선택하십시오. 최고는 더 많은 장점입니다 use ..., only: ... 각 수입에서는하지만 경우에 따라 간단한 명명 규칙이이를 수행합니다 (충분히 훈련 된 경우).

예, 사용하십시오 use module, only: .... 여러 프로그래머가있는 대형 코드베이스의 경우 모든 사람이 코드를 쉽게 따라갈 수 있습니다 (또는 그냥 사용합니다. grep).

포함하지 마십시오. 대신 작은 모듈을 사용하십시오. 포함 모듈과 동일한 수준에서 컴파일러에서 확인하지 않은 소스 코드의 텍스트 삽입은 다음과 같습니다. FORTRAN : 포함과 모듈의 차이. Include 일반적으로 인간과 컴퓨터 모두 코드를 사용하기가 더 어려워집니다. 전. MPI-Forum에서 : "MPIF.H 포함 파일의 사용은 강력하게 낙담하며 향후 MPI 버전에서는 더 이상 사용되지 않을 수 있습니다." (http://mpi-forum.org/docs/mpi-3.1/mpi31-report/node411.htm).

내가 조금 늦은 파티에,하지만 경우에 당신은 후에만 설정 상수시 반드시 계산 된 값이,당신이 할 수 있는 다음과 같 C 들을 포함 파:

내부에 파일 예를 들어,상수입니다.대

real, parameter :: pi = 3.14
real, parameter :: g = 6.67384e-11
...


program main
    use module1, only : func1, subroutine1, func2 
    implicit none

    include 'constants.for'
    ...
end program main

편집을 제거하"부(4)"으로 어떤 생각하는것은 나쁜습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top